设计模式一:策略模式

来源:互联网 发布:路由访客网络什么意思 编辑:程序博客网 时间:2024/06/09 22:19

一.策略模式中用到的设计原则

1.找出代码中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起.
2.针对接口编程,而不是实现编程

二.策略模式

1.概念

定义了算法族,分别分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

2.为什么使用策略模式

如果现在有一个超类Duck(鸭子),该鸭子有飞,叫等行为,现在我们要实现两个子类,这两个子类也要有飞,叫等行为,那我们直接继承此超类Duck即可,但现在需要一个会呱呱叫或者嘎嘎叫的子类,总之和超叫的行为有差异,那我们可以在写一个子类,重写其超类的叫方法,如果还有其它的变化,那么要写很多的子类,非常麻烦。
下面我们使用策略模式来解决
策略模式把其变化的部分和不变的部分分开,上述代码中变化的部分是鸭子的行为,所以我们把鸭子的行为提出来,用接口和实现类的方式来表示。

三.代码

超类:

public  abstract class Duck {   FlyBehavior flyBehavior;   QuackBehavior quackBehavior;      public Duck(){   flyBehavior = new FlyNoWay();   quackBehavior= new Quack();   }      public void performFly(){   flyBehavior.fly();   }      public void performQuack(){   quackBehavior.quack();   }public FlyBehavior getFlyBehavior() {return flyBehavior;}public void setFlyBehavior(FlyBehavior flyBehavior) {this.flyBehavior = flyBehavior;}public QuackBehavior getQuackBehavior() {return quackBehavior;}public void setQuackBehavior(QuackBehavior quackBehavior) {this.quackBehavior = quackBehavior;}      }

飞行为接口:

public interface FlyBehavior {public void fly();}

叫行为接口:

public interface QuackBehavior {  public void quack();}

飞行为两个实现类:

public class FlyNoWay implements FlyBehavior {@Overridepublic void fly() {// TODO Auto-generated method stub   System.out.println("I can't fly");}}

public class FlyWithWings implements FlyBehavior {@Overridepublic void fly() {// TODO Auto-generated method stub  System.out.println("I'm  fly");}}

叫行为两个实现类:

public class MuteQuack implements QuackBehavior {@Overridepublic void quack() {// TODO Auto-generated method stub  System.out.println("Mute Quack");}}

public class Quack implements QuackBehavior {@Overridepublic void quack() {// TODO Auto-generated method stub     System.out.println("quack");}}

子类:

public class MinaDuck extends Duck { public static void main(String[] args) {//默认的行为 MinaDuck  minaDuck= new MinaDuck(); minaDuck.performFly(); minaDuck.performQuack(); //当行为改变时,不需要其重新继承Duck,生成其子类,只要其设置不同的行为即可 FlyBehavior flyBehavior = new FlyWithWings(); minaDuck.setFlyBehavior(flyBehavior); minaDuck.performFly();}}


0 0
原创粉丝点击