标签:
学习自:http://shenzhenchufa.blog.51cto.com/730213/161581
代码来自:http://shenzhenchufa.blog.51cto.com/730213/161581
感谢博主:shenzhenchufa。
学习之余我写一些自己的心得。无心侵犯版权,用于自己学习。
------------------------- strategy(策略模式) -------------------------
我们有一个设计原则:
找出应用中相同之处,且不容易发生变化的东西,把它们抽取到抽象类中,让子类去继承它们;
找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。 -->important.
public interface FlyBehavior{ public void fly(); } public interface QuackBehavior{ public void quack(); }
我们在定义一些针对FlyBehavior的具体实现。
public class FlyWithWings implements FlyBehavior{ public void fly(){ //实现了所有有翅膀的鸭子飞行行为。 } } public class FlyNoWay implements FlyBehavior{ public void fly(){ //什么都不做,不会飞 } }
针对QuackBehavior的几种具体实现。
public class Quack implements QuackBehavior{ public void quack(){ //实现呱呱叫的鸭子 } } public class Squeak implements QuackBehavior{ public void quack(){ //实现吱吱叫的鸭子 } } public class MuteQuack implements QuackBehavior{ public void quack(){ //什么都不做,不会叫 } }
点评一:
这样的设计,可以让飞行和呱呱叫的动作被其他的对象复用,因为这些行为已经与鸭子类无关了。而我们增加一些新
public class Duck{ --------->在抽象类中,声明各接口,定义各接口对应的方法. FlyBehavior flyBehavior;//接口 QuackBehavior quackBehavior;//接口 public Duck(){} public abstract void display(); public void swim(){ //实现游泳的行为 } public void performFly(){ flyBehavior.fly(); -->由于是接口,会根据继承类实现的方式,而调用相应的方法. } public void performQuack(){ quackBehavior.quack();(); } }
看看MallardDuck如何实现。
----->通过构造方法,生成‘飞‘,‘叫‘具体实现类的实例,从而指定‘飞‘,‘叫‘的具体属性
public class MallardDuck extends Duck{ public MallardDuck { flyBehavior = new FlyWithWings (); quackBehavior = new Quack(); //因为MallardDuck 继承了Duck,所有具有flyBehavior 与quackBehavior 实例变量} public void display(){ //实现 } }
这样就满足了即可以飞,又可以叫,同时展现自己的颜色了。
public class Duck{ FlyBehavior flyBehavior;//接口 QuackBehavior quackBehavior;//接口 public void setFlyBehavior(FlyBehavior flyBehavior){ this.flyBehavior = flyBehavior; } public void setQuackBehavior(QuackBehavior quackBehavior { this.quackBehavior= quackBehavior; } }
策略模式:我本身具有几种不确定的行为,不知道行为应该如何具体进行表现,当我收到一个具体的行为,我根据具体的行为进行表现。
标签:
原文地址:http://www.cnblogs.com/v-weiwang/p/4809857.html