根据《 Head First 设计模式(中文版) 》上的例子编写的代码
鸭子的抽象超类
package DesignPattern.Strategy;
public abstract class DuckAbstract {
public DuckAbstract() {
}
public abstract void display(); //鸭子的继承类覆写
public FlyBehaviorStrategy fly; //飞行行为接口
public QuackBehaviorStrategy quack; //呱呱叫行为接口
//调用飞行接口的方法
public void perforFly() {
fly.fly();
}
//调用呱呱叫接口的方法
public void perforQuack() {
quack.quack();
}
//在运行时改变鸭子的飞行方式
public void setFly(FlyBehaviorStrategy fly) {
this.fly = fly;
}
//在运行时改变鸭子的叫的方式
public void setQuack(QuackBehaviorStrategy quack) {
this.quack = quack;
}
}
package DesignPattern.Strategy;
/**
* @author admini
* 飞行 行为 接口
*/
public interface FlyBehaviorStrategy {
/**
* 飞行
*/
public void fly() ;
}
package DesignPattern.Strategy;
public class FlyBehaviorStrategyImpl implements FlyBehaviorStrategy {
@Override
public void fly() {
System.out.println("进行普通飞行模式");
}
}
package DesignPattern.Strategy;
public class FlyStuntBehaviorStrategyImpl implements FlyBehaviorStrategy {
@Override
public void fly() {
System.out.println("进行表演特技飞行模式");
}
}
package DesignPattern.Strategy;
/**
* @author admini
* 呱呱叫 行为 接口
*/
public interface QuackBehaviorStrategy {
/**
* 呱呱叫
*/
public void quack() ;
}
package DesignPattern.Strategy;
public class QuackBehaviorStrategyImpl implements QuackBehaviorStrategy {
@Override
public void quack() {
System.out.println("呱呱叫");
}
}
package DesignPattern.Strategy;
public class QuackMuteBehaviorStrategyImpl implements QuackBehaviorStrategy {
@Override
public void quack() {
System.out.println("不会叫的");
}
}
鸭子继承超类
package DesignPattern.Strategy;
public class Duck extends DuckAbstract {
public Duck() {
fly = new FlyBehaviorStrategyImpl(); //默认为普通飞行模式
quack = new QuackBehaviorStrategyImpl();//默认为呱呱叫
}
@Override
public void display() {
System.out.println("这是一只鸭子");
}
}
绿头鸭继承超类
package DesignPattern.Strategy;
public class DuckMallard extends DuckAbstract {
public DuckMallard() {
fly = new FlyStuntBehaviorStrategyImpl(); //默认为特技飞行模式
quack = new QuackMuteBehaviorStrategyImpl();//默认为不会叫的
}
@Override
public void display() {
System.out.println("这是一只绿头鸭");
}
}
测试类
package DesignPattern;
import org.junit.Test;
import DesignPattern.Strategy.*;
public class DesignPatternTest {
@Test
public void strategyTest() {
DuckAbstract du = new Duck();//普通鸭子
du.display();
du.perforFly();
du.perforQuack();
du.setFly(new FlyStuntBehaviorStrategyImpl());
du.perforFly();
System.out.println("######################################");
DuckAbstract dm = new DuckMallard();//绿头鸭
dm.display();
dm.perforFly();
dm.perforQuack();
dm.setFly(new FlyBehaviorStrategyImpl());
dm.perforFly();
dm.setQuack(new QuackBehaviorStrategyImpl());
dm.perforQuack();
}
}
这是一只鸭子
进行普通飞行模式
呱呱叫
进行表演特技飞行模式
######################################
这是一只绿头鸭
进行表演特技飞行模式
不会叫的
进行普通飞行模式
呱呱叫