策略模式(定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户)
1、把鸭子的行为比作是一族算法,那么可以很容易的使用算法计算不同州的销售税金。
2、可以在运行时动态的改变行为。
3、行为中可以添加属性。
4、要添加新的行为只需要定义行为接口,编写实现行为接口的具体行为,然后在Duck中引用该行为
(1) 找出应用中可能需要变化的代码独立出来,不要和不需要变化的代码混在一起。
(2) 针对接口编程,而不是针对实现编程。
(3) 多用组合,少用继承。
public abstract class Duck {
public FlyBehavior flyBehavior;
public QuackBehavior quackBehavior;
public Duck(){
super();
}
public void fly(){
flyBehavior.fly();
}
public void quack(){
quackBehavior.quack();
}
public void swing(){
System.out.println("I am Swing.");
}
public abstract void display();
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
public interface QuackBehavior {
public void quack();
}
public interface FlyBehavior {
public void fly();
}
public class Squack implements QuackBehavior {
@Override
public void quack() {
System.out.println("========Squack=========");
}
}
public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("========quack=========");
}
}
public class FlyWithWing implements FlyBehavior {
@Override
public void fly() {
System.out.println("I am flying.");
}
}
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("sorry, I can not fly.");
}
}
public class Aduck extends Duck {
public Aduck(){
this.flyBehavior = new FlyWithWing();
this.quackBehavior = new Quack();
}
@Override
public void display() {
System.out.println("I am A duck.");
}
}
public class DuckTest {
public static void main(String[] args) {
Duck duck = new Aduck();
duck.fly();
duck.swing();
duck.quack();
duck.display();
System.out.println("------change duck behavior begin");
duck.setFlyBehavior(new FlyNoWay());
duck.fly();
}
}