Java的设计模式----strategy(策略模式)
public abstract class Duck{ public void quack(){ //呱呱叫 System.out.println("呱呱叫"); } public void swim(){ //游泳 System.out.println(" 游泳"); } public abstract void display(); /*因为外观不一样,让子类自己去决定了。*/ }
对于它的子类只需简单的继承就可以了,并实现自己的display()方法。
//野鸭
public class MallardDuck extends Duck{ public void display(){ System.out.println("野鸭的颜色..."); } }
//红头鸭
public class RedheadDuck extends Duck{ public void display(){ System.out.println("红头鸭的颜色..."); } }
public abstract class Duck{ public void quack(){ //呱呱叫 System.out.println("呱呱叫"); } public void swim(){ //游泳 System.out.println(" 游泳"); } public abstract void display(); /*因为外观不一样,让子类自己去决定了。*/ public void fly(){ System.out.println("飞吧!鸭子"); } }
对于不能飞的鸭子,在子类中只需简单的覆盖。
//残废鸭
public class DisabledDuck extends Duck{ public void display(){ System.out.println("残废鸭的颜色..."); } public void fly(){ //覆盖,变成什么事都不做。 } }
其它会飞的鸭子不用覆盖。
public interface Flyable{ public void fly(); } public interface Quackable{ public void quack(); }
最后Duck的设计成为:
public abstract class Duck{ public void swim(){ //游泳 System.out.println(" 游泳"); } public abstract void display(); /*因为外观不一样,让子类自 己去决定了。*/ }
而MallardDuck,RedheadDuck,DisabledDuck 就可以写成为:
//野鸭
public class MallardDuck extends Duck implements Flyable,Quackable{ public void display(){ System.out.println("野鸭的颜色..."); } public void fly(){ //实现该方法 } public void quack(){ //实现该方法 } }
//红头鸭
public class RedheadDuck extends Duck implements Flyable,Quackable{ public void display(){ System.out.println("红头鸭的颜色..."); } public void fly(){ //实现该方法 } public void quack(){ //实现该方法 } }
//残废鸭 只实现Quackable(能叫不能飞)
public class DisabledDuck extends Duck implements Quackable{ public void display(){ System.out.println("残废鸭的颜色..."); } public void quack(){ //实现该方法 } }
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 abstract 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 abstract class Duck{ FlyBehavior flyBehavior;//接口 QuackBehavior quackBehavior;//接口 public void setFlyBehavior(FlyBehavior flyBehavior){ this.flyBehavior = flyBehavior; } public void setQuackBehavior(QuackBehavior quackBehavior { this.quackBehavior= quackBehavior; } }
本文出自 “Changes we need ! ” 博客,请务必保留此出处http://shenzhenchufa.blog.51cto.com/730213/161581
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。