设计模式之策略模式Strategy
/** * 策略设计模式 * 策略模式:定义一系列的算法族,使他们之间可以相互转换,动态的改变其行为。 * 问题:设计一个鸭子模拟游戏。 * 现在有一群鸭子: * ①这些鸭可以有飞的行为(分为快和慢),也可以没有飞的行为; * ②对于鸭的叫声有沉默,也有响亮地叫,或者说也有小声地叫。那么按照我们平时的设计习惯,我们首先会定义一个父类(鸭), * 然后我们将这两种行为排列组合将产生3*3=9个鸭子的子类,这是一件多么费体力的事情。如果说还有另外一些行为呢,那又要乘了,所以这种设计方式显然不好。 * 我们现在采用策略设计模式:将行为抽象定义成各个接口,然后将他们的具体行为封装成各个对象,使这些对象可以相互转换。 * User: HYY * Date: 13-11-11 * Time: 下午11:31 * To change this template use File | Settings | File Templates. */ abstract class Duck { protected FlyBehavior flyBehavior; protected QuackBehavior quackBehavior; public void performFly() { this.flyBehavior.fly(); } public void performQuack() { this.quackBehavior.quack(); } //鸭子的外观 public abstract void display(); //以下两个setter用于动态的设置鸭的行为 void setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior = flyBehavior; } void setQuackBehavior(QuackBehavior quackBehavior) { this.quackBehavior = quackBehavior; } } //以下定义两个行为接口 interface FlyBehavior { public void fly(); } interface QuackBehavior { public void quack(); } //以下四个类定义具体的“飞”和“鸭叫”行为 class HighSpeedFlyBehavior implements FlyBehavior { public void fly() { System.out.println("我正在高速飞翔!"); } } class SlowSpeedFlyBehavior implements FlyBehavior { public void fly() { System.out.println("我正在缓慢飞翔!"); } } class SilenceQuackBehavior implements QuackBehavior { public void quack() { System.out.println("- - - - - 沉默地叫 - - - - "); } } class LoudQuackBehavior implements QuackBehavior { public void quack() { System.out.println("我正在大声地叫喊!"); } } //下面两个类继承Duck类,是具体的鸭种类 /** * 这个是绿头鸭子类(假设飞的慢而没有叫声) */ class MallardDuck extends Duck { public MallardDuck() { super(); this.flyBehavior = new SlowSpeedFlyBehavior(); this.quackBehavior = new SilenceQuackBehavior(); } @Override public void display() { System.out.println("我是绿头鸭子!"); } } /** * 这个是红头鸭子(假设飞的快而且叫声响亮) */ class RedheadDuck extends Duck { public RedheadDuck() { super(); this.flyBehavior = new HighSpeedFlyBehavior(); this.quackBehavior = new LoudQuackBehavior(); } @Override public void display() { System.out.println("我是红头鸭子!"); } } public class Main { public static void main(String[] args) { Duck redheadDuck = new RedheadDuck(); redheadDuck.display(); redheadDuck.performFly(); redheadDuck.performQuack(); //动态改变红头鸭子的飞和叫行为 System.out.println("———————————————————————————————————"); redheadDuck.setFlyBehavior(new SlowSpeedFlyBehavior()); redheadDuck.setQuackBehavior(new SilenceQuackBehavior()); redheadDuck.performFly(); redheadDuck.performQuack(); } }
本文出自 无忧之路 - 博客园