设计模式-策略模式

来源:互联网 发布:c语言成绩查询系统湖北 编辑:程序博客网 时间:2024/06/07 01:00

策略模式(定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户)
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();    }}
原创粉丝点击