策略模式:定义了算法族,分别封装起来,让它们之间可以互相转换,此模式让算法的变化独立于使用算法的客户。
设计原则:
1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
2.针对接口编程(针对超类)而不是针对实现编程。
3.多用组合少用继承。
抽象出来的飞行行为:
public interface FlyBehavior {
void fly();
}
具体的不同飞行行为:
public class FlyWithLag implements FlyBehavior{
@Override
public void fly() {
System.out.println("用脚去飞~");
}
}
public class FlyWithSwing implements FlyBehavior {
@Override
public void fly() {
System.out.println("会用翅膀飞~");
}
}
抽象Duck类
public abstract class Duck {
//使用组合的方式
private FlyBehavior flyBehavior;
public Duck(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void displayFlay(){
flyBehavior.fly();
}
}
具体的不同类Duck
public class YellowDuck extends Duck{
public YellowDuck(FlyBehavior flyBehavior) {
super(flyBehavior);
}
}
public class BlackDuck extends Duck {
public BlackDuck(FlyBehavior flyBehavior) {
super(flyBehavior);
}
}
测试类:
public class DuckTest {
public static void main(String[] args) {
Duck blackDuck = new BlackDuck(new FlyWithSwing());
blackDuck.displayFlay(); //输出: 会用翅膀飞~
Duck yellowDuck = new YellowDuck(new FlyWithLag());
yellowDuck.displayFlay(); //输出: 用脚去飞~
}
}