Strategy パターン

Strategy パターン

Step 3 委譲

MiniDuckSimulator
Step 1

public class MiniDuckSimulator {
    public static void main(String[] args) {
        MallardDuck mallard = new MallardDuck();
        RedHeadDuck redhead = new RedHeadDuck();

        mallard.display();
        mallard.performQuack();
        mallard.performFly(); 

        System.out.println();

        redhead.display();
        redhead.performQuack();
        redhead.performFly(); 
    }
}

Step 2

public class MiniDuckSimulator {
    public static void main(String[] args) {
        MallardDuck mallard = new MallardDuck();
        RedHeadDuck redhead = new RedHeadDuck();
        RubberDuck  rubber  = new RubberDuck(); // 追加
        DecoyDuck   decoy   = new DecoyDuck();  // 追加

        mallard.display();
        mallard.performQuack();
        mallard.performFly(); 

        System.out.println();

        redhead.display();
        redhead.performQuack();
        redhead.performFly(); 

        System.out.println();

        // 追加
        rubber.display();
        rubber.performQuack();
        rubber.performFly(); 

        System.out.println();

        // 追加
        decoy.display();
        decoy.performQuack();
        decoy.performFly(); 
    }
}

Step 3
変更なし

Duck
Step 1, Step 2

public abstract class Duck {
    public Duck() {
    }

    abstract void display();

    public void performFly() {
        System.out.println("I'm flying!!");
    }

    public void performQuack() {
        System.out.println("Quack");
    }
}

Step 3

public abstract class Duck {
    // 追加
    FlyBehavior   flyBehavior;
    QuackBehavior quackBehavior;

    public Duck() {
    }

    abstract void display();

    public void performFly() {
        // 変更
        flyBehavior.Fly();
    }

    public void performQuack() {
        // 変更
        quackBehavior.Quack();
    }
}

FlyBehavior
追加

public interface FlyBehavior {
    public void Fly();
}

FlyWithWings
追加

public class FlyWithWings implements FlyBehavior {
    public void Fly() {
        System.out.println("I'm flying!!");
    }
}

FlyNoWay
追加

public class FlyNoWay implements FlyBehavior {
    public void Fly() {
        System.out.println("I can't fly");
    }
}

QuackBehavior
追加

public interface QuackBehavior {
    public void Quack();
}

Quack
追加

public class Quack implements QuackBehavior {
    public void Quack() {
        System.out.println("Quack");
    }
}

Squeak
追加

public class Squeak implements QuackBehavior {
    public void Quack() {
        System.out.println("Squeak");
    }
}

MuteQuack
追加

public class MuteQuack implements QuackBehavior {
    public void Quack() {
        System.out.println("<< Silence >>");
    }
}

MallardDuck
Step 1, Step 2

public class MallardDuck extends Duck {

    public MallardDuck() {
    }

    public void display() {
        System.out.println("I'm a real Mallard duck");
    }
}

Step 3

public class MallardDuck extends Duck {

    public MallardDuck() {
        // 追加
        flyBehavior   = new FlyWithWings();
        quackBehavior = new Quack();
    }

    public void display() {
        System.out.println("I'm a real Mallard duck");
    }
}

RedHeadDuck
Step 1, Step 2

public class RedHeadDuck extends Duck {

    public RedHeadDuck() {
    }

    public void display() {
        System.out.println("I'm a real Red Headed duck");
    }
}

Step 3

public class RedHeadDuck extends Duck {

    public RedHeadDuck() {
        // 追加
        flyBehavior   = new FlyWithWings();
        quackBehavior = new Quack();
    }

    public void display() {
        System.out.println("I'm a real Red Headed duck");
    }
}

RubberDuck
Step 2

public class RubberDuck extends Duck {

    public RubberDuck() {
    }

    public void display() {
        System.out.println("I'm a rubber duckie");
    }

    // オーバーライド
    public void performFly() {
        System.out.println("I can't fly");
    }

    // オーバーライド
    public void performQuack() {
        System.out.println("Squeak");
    }
}

Step 3

public class RubberDuck extends Duck {

    public RubberDuck() {
        // 追加
        flyBehavior   = new FlyNoWay();
        quackBehavior = new Squeak();
    }

    public void display() {
        System.out.println("I'm a rubber duckie");
    }
}

DecoyDuck
Step 2

public class DecoyDuck extends Duck {

    public DecoyDuck() {
    }

    public void display() {
        System.out.println("I'm a duck Decoy");
    }

    // オーバーライド
    public void performFly() {
        System.out.println("I can't fly");
    }

    // オーバーライド
    public void performQuack() {
        System.out.println("<< Silence >>");
    }
}

Step 3

public class DecoyDuck extends Duck {

    public DecoyDuck() {
        // 追加
        flyBehavior   = new FlyNoWay();
        quackBehavior = new MuteQuack();
    }

    public void display() {
        System.out.println("I'm a duck Decoy");
    }
}

実行結果

I'm a real Mallard duck
Quack
I'm flying!!

I'm a real Red Headed duck
Quack
I'm flying!!

I'm a rubber duckie
Squeak
I can't fly

I'm a duck Decoy
<< Silence >>
I can't fly