设计模式之策略模式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();
    }
}

 

posted @ 2013-11-12 00:30  无忧之路  阅读(247)  评论(0编辑  收藏  举报
无忧之路