【学习笔记】设计模式-策略模式

来源:互联网 发布:网络创业培训试题 编辑:程序博客网 时间:2024/06/04 23:18

前言
本文来自《Head Fist 设计模式》一书的实例,这里仅仅是个人笔记记录

策略模式的定义

定义了算法族,分别封装起来,让他们之间可以相互转换,此模式让算法的变化独立于使用算法的客户

Demo 需求

鸭子游戏文化公司旗下有3款鸭子
绿鸭子:会游泳,会飞,会叫
哑巴鸭子:会游泳,会飞,不会叫
塑料鸭子:会游泳,不会飞,不会叫
其中后期塑料鸭子会加入声音功能,需要预留接口后续拓展

需求分析

3款鸭子都会游泳,可以使用Duck基类,子类继承即可
会飞,会叫的行为是根据鸭子的形态动态的变化,这里我们可以使用setBehavior()来进行动态设置

开发

定义Duck超类及其子类

Duck 基类

package strategy_pattern;/** * 基类 * 1.游泳 * 2.叫 * 3.飞 * * 其中所有的鸭子都会游泳 * 全能鸭子:会游泳,会叫,会飞 * 塑料鸭子:会游泳,不会叫,不会飞 * 哑巴鸭子:会游泳,不会叫,会飞 * * 上述的需求 * 会游泳,可以根据继承的关系实现这个基类 * 会叫和会飞的行为要区分个性化处理 */public class Duck {    private FlyBehavior mFlyBehavior;    private SqueakBehavior mSqueakBehavior;    public void setFlyBehavior(FlyBehavior mFlyBehavior) {        this.mFlyBehavior = mFlyBehavior;    }    public void setSqueakBehavior(SqueakBehavior mSqueakBehavior) {        this.mSqueakBehavior = mSqueakBehavior;    }    public void swim() {        System.out.print("I can swim");    }    public void performerFly() {        mFlyBehavior.fly();    }    public void performSqueak() {        mSqueakBehavior.performSqueak();    }}

Duck 子类

package strategy_pattern;/** * 全能的鸭子,会游泳,会飞,会叫 */public class GreenDuck extends Duck {    public GreenDuck() {        mFlyBehavior = new YesFlyBehavior();        mSqueakBehavior = new YesSqueakBehavior();    }}package strategy_pattern;/** * 哑巴鸭子,会游泳,会飞,但是不会叫 */public class MuteDuck extends  Duck{    public void MuteDuck() {        mFlyBehavior = new YesFlyBehavior();        mSqueakBehavior = new NoSqueakBehavior();    }}package strategy_pattern;/** * 塑料鸭子,只会游泳,不会飞,不会叫 */public class PlasticsDuck extends Duck {    public void PlasticsDuck() {        mFlyBehavior = new NoSqueakBehavior();        mSqueakBehavior = new NoSqueakBehavior();    }}

定义行为接口

基类接口

package strategy_pattern;/** * Created by Fadi.Su on 2017/11/25. */public interface SqueakBehavior {    void performSqueak();}package strategy_pattern;/** * Created by Fadi.Su on 2017/11/25. */public interface FlyBehavior {    void fly();}

接口子类

package strategy_pattern;/** * Created by Fadi.Su on 2017/11/25. */public class YesFlyBehavior implements FlyBehavior{    @Override    public void fly() {        System.out.print("I can fly");    }}package strategy_pattern;/** * Created by Fadi.Su on 2017/11/25. */public class NoFlyBehavior implements FlyBehavior{    @Override    public void fly() {        System.out.print("I can not fly");    }}package strategy_pattern;/** * Created by Fadi.Su on 2017/11/25. */public class YesSqueakBehavior implements SqueakBehavior{    @Override    public void performSqueak() {        System.out.print("I can Squeak");    }}package strategy_pattern;/** * Created by Fadi.Su on 2017/11/25. */public class NoSqueakBehavior implements SqueakBehavior{    @Override    public void performSqueak() {        System.out.print("I can not Squeak");    }}

Duck类和行为类联通调试

/**    *   定义了算法族,分别封装起来,让他们之间可以相互转换,此模式让算法的变化独立于使用算法的客户    */    public void testDuck() {        // 绿鸭子:会游泳,会飞,会叫        Duck mGreenDuck = new GreenDuck();        mGreenDuck.swim();// 继承实现        mGreenDuck.performerFly(); // 策略模式        mGreenDuck.performSqueak();// 策略模式        // 哑巴鸭子:会游泳,会飞,不会叫        Duck mMuteDuck = new MuteDuck();        mMuteDuck.swim();// 继承实现        mMuteDuck.performerFly();// 策略模式        mMuteDuck.performSqueak();// 策略模式        // 塑料鸭子:会游泳,不会飞,不会叫        Duck mPlasticsDuck = new PlasticsDuck();        mPlasticsDuck.swim();// 继承实现        mPlasticsDuck.performerFly();// 策略模式        mPlasticsDuck.performSqueak();// 策略模式        /**        *        * 策略模式的特点,可以动态改变类的行为        * 这样使得塑料鸭子赋予了叫的功能        */        mPlasticsDuck.setSqueakBehavior(new YesFlyBehavior());        mPlasticsDuck.performerFly();    }

结语

       /**        *        * 策略模式的特点,可以动态改变类的行为        * 这样使得塑料鸭子赋予了叫的功能        */        mPlasticsDuck.setSqueakBehavior(new YesFlyBehavior());        mPlasticsDuck.performerFly();

其实我们写代码中经常无意地使用了策略模式。