参考: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(); } }