设计模式——策略模式

来源:互联网 发布:百雀羚保湿精华霜 知乎 编辑:程序博客网 时间:2024/05/18 02:17

参考:http://blog.csdn.net/gnuhpc/article/details/5360328#


策略模式定义了算法簇,分别封装起来,让它们之间可以互相替换,此模式让方法的变化独立于使用方法的Client,适用于继承后的动作发生变化,要动态的改变对象的行为时。

核心思想:将is-a 转换为has-a.

基本的思路:将一些原先要继承的方法,以接口的方式抽象出来,然后再以实现该接口的方式定义一些类以完成实际能力的实现;同时在基类中以组合的方式将该接口的实例放入基类,基类同时提供设置这个实例的接口以及这个方法的封装,子类继承基类是对这些接口实例进行设置即可。

设计原则1:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起,把会变化的部分取出并封装起来,好让其他部分不会受到影响

设计原则2:针对接口编程,而不是针对实现编程。

针对实现编程针对接口编程更好的针对接口编程Dog d=new Dog(); 
d.dark();Animal animal=new Dog(); 
animal.makesound();a = getAnimal(); 
a.makeSound();不得不针对具体实现coding利用animal多态处理运行时才指定具体实现的对象设计原则3:多用组合,少用继承。这样可使系统更具有弹性。


类图:



鸭子的设计问题:




代码:

//fly行为  //  飞行接口public interface FlyBehavior { public void fly(); } //  飞public class FlyWithWings implements FlyBehavior{ public void fly() {         System.out.println("正在用翅膀飞行");     } } //  不飞public class FlyNoWay implements FlyBehavior{ public void fly() {         System.out.println("不会飞");     } } //坐火箭飞public class FlyRocketPowered implements FlyBehavior{ public void fly() {         System.out.println("坐火箭飞");     } } quack行为//  叫接口public interface QuackBehavior { public void quack(); } // 嘎嘎叫public class Quack implements QuackBehavior. { public void quack() {         System.out.println("嘎嘎叫");     } } //  吱吱叫public class Squeak implements QuackBehavior{ public void quack() {         System.out.println("吱吱叫");     } } //  不叫public class MuteQuack implements QuackBehavior{ public void quack() {         System.out.println("不会叫");     } }//实现Duck类 //  鸭子超类public abstract class Duck { //  默认的行为    FlyBehavior flyBehavior;     QuackBehavior quackBehavior; public Duck() {     } public void setFlyBehavior(FlyBehavior. fb) {         flyBehavior = fb;     } public void setQuackBehavior(QuackBehavior. qb) {         quackBehavior = qb;     } abstract void display(); public void performFly() {         flyBehavior.fly();     } public void performQuack() {         quackBehavior.quack();     } public void swim() {         System.out.println("正在游泳~~");     } } 建立不同的鸭子类//  野鸭       public class MallardDuck extends Duck {       public MallardDuck() {           quackBehavior = new Quack();                   flyBehavior = new FlyWithWings();  //这里也可以使用setFlyBehavior方法,下同!     }       public void display() {           System.out.println("绿头鸭");       }  }       //  红头鸭       public class RedHeadDuck extends Duck {       public RedHeadDuck() {           flyBehavior = new FlyWithWings();           quackBehavior = new Quack();       }       public void display() {           System.out.println("红头鸭");       }  }       //  橡皮鸭      public class RubberDuck extends Duck {       public RubberDuck() {           flyBehavior = new FlyNoWay();           quackBehavior = new Squeak();       }       public void display() {           System.out.println("橡皮鸭");       }  }       //模型鸭  public class ModelDuck extends Duck {       public ModelDuck() {           flyBehavior = new FlyNoWay();           quackBehavior = new Quack();       }       public void display() {           System.out.println("模型鸭");       }  } //测试代码:public class MiniDuckSimulator { public static void main(String[] args) {         MallardDuck    mallard = new MallardDuck();          RubberDuck    rubberDuckie = new RubberDuck();          RedHeadDuck    redHeadDuck = new RedHeadDuck();         ModelDuck    model = new ModelDuck();         mallard.performQuack();          rubberDuckie.performQuack();          redHeadDuck.performQuack();         model.performFly();              model.setFlyBehavior(new FlyRocketPowered());          model.performFly();      }  } 




原创粉丝点击