FlyBehavior 接口及两个实现类FlyWithWings、FlyNoWay
<pre name="code" class="java">public interface FlyBehavior{
public void fly();
}
public class FlyWithWings implements FlyBehavior{
public void fly(){
System.out.println("I can flying !");
}
}
public class FlyNoWay implements FlyBehavior{
public void fly(){
System.out.println("I cannot flying !");
}
}
public class FlyRocketPowered implements FlyBehavior{
public void fly(){
System.out.println("I am flying with rocket !");
}
}
父类Duck
<pre name="code" class="java">public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public abstract void display();
public void performFly(){
flyBehavior.fly();
}
public void performQuack(){
quackBehavior.quack();
}
public void swim(){
System.out.prilntln("all ducks float,even decoys !"); <span style="font-family: Arial, Helvetica, sans-serif;"> </span>
<pre name="code" class="java"> }
public void setFlyBehavior(FlyBehavior fb){
flyBehavior=fb;
}
public void setQuackBehavior(QuackBehavior qb){
quackBehavior=qb;
}
}
子类MallardDuck、ModelDuck
public class MallardDuck extends Duck(){
public MallardDuck(){
quackBehavior=new Quack();
flyBehavior=new FlyWithWings();
}
public void display(){
System.out.println("I am a real mallard duck !");
}
}
public class ModelDuck extends Duck(){
public ModelDuck(){
quackBehavior=new Quack();
flyBehavior=new FlyNoWay();
}
public void display(){
System.out.println("I am a real model duck !");
}
}
测试类
<pre name="code" class="java">public class MiniDuckSimulator{
public static void main(String[] args){
Duck mallard=new MallardDuck();
mallard.performFly(); <span style="font-family: Arial, Helvetica, sans-serif;"> //I can flying!</span>
mallard.performQuack(); //Quack
Duck model=new ModelDuck();
model.performFly(); //I cannot flying!
model.setFlyBehavior(new FlyRocketPowered());<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
<pre name="code" class="html"> model.performFly(); //I am flying with rocket !
}
}
**来自head first设计模式 的第一章节代码整理。