美文网首页
Head First 策略模式

Head First 策略模式

作者: 酥酥肉 | 来源:发表于2018-11-14 13:32 被阅读0次

设计原则一

1、找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起
把会变化的部分取出来“封装”起来,以便以后可以轻易改动或扩充此部分

设计原则二

针对接口编程,而不是针对实现编程
利用接口代表行为,比如鸭子的fly-behavior ,而行为的每个实现都将实现一个接口

设计原则三

多用组合,少用集成

策略模式

策略模式定义的算法族, 分别封装起来,让他们之间可以互相转换,此模式让算法的变化独立于使用算法的客户
类似 鸭子的飞,叫的行为,有不同===> 算法的变化

基础类

public abstract class Duck {
    protected FlyBehavior flyBehavior;
    protected QuackBehavior quackBehavior;

    /**
     * 鸭子的外观
     */
    public abstract void display();

    /**
     * 游泳
     */
    public void swim() {
        System.out.println("我游啊游啊游......");
    }
    /**
     * 飞行
     */
    public void performFly() {
        //将飞行这件小事委托给行为类
        if (flyBehavior != null)
            flyBehavior.fly();
    }

    /**
     * 设置鸭子的飞行行为
     *
     * @param flyBehavior 飞
     */
    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    /** * 叫  */
    public void performQuack() {
        //将浪叫这件小事委托给行为类
        if (quackBehavior != null)
            quackBehavior.quack();
    }
    /**
     * 设置鸭子叫的行为
     *
     * @param quackBehavior 叫
     */
    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }
}

总结,这里把鸭子叫,非的不确定行为抽象出来,使用 组合的方式组合起来
但是鸭子确定的行为就可以保留在基类里

public interface FlyBehavior {
    /**
     * 飞行
     */
    void fly();
}

public interface QuackBehavior {
    /**
     * 叫
     */
    void quack();
}

这里想实现怎么飞就怎么飞,用翅膀,坐飞机,坐火箭。这样就能达到代码复用,只用维护一份,
比如这里实现用翅膀飞

public class FlyWithWings implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println("我飞起来了!!!");
    }
}

实现一只绿头鸭

public class MallardDuck extends Duck {

    public MallardDuck() {
        flyBehavior = new FlyNoWay();
        quackBehavior = new Quack();
    }

    @Override
    public void display() {
        System.out.println("我可是一只货真价实的野鸭子!");
    }
}

测试

public static void main(String[] args) {

        System.out.println("Hello World!");
        Duck duck = new MallardDuck();
        duck.swim();
        duck.display();
        duck.performFly();
        duck.performQuack();

        //现在会飞了
        duck.setFlyBehavior(new FlyWithWings());
        duck.performFly();
        //可是不会叫了
        duck.setQuackBehavior(new MuteQuack());
        duck.performQuack();
    }

相关文章

  • 设计模式--策略模式

    ps:本文主要来源于Head First 设计模式(抄Head First的),如有不懂请购买原书观看。 策略模式...

  • 策略模式(详解)

    策略模式(来自HeadFirst设计模式) 今天看了 Head First 设计模式的第一个模式,居然是策略模式,...

  • Head First 策略模式

    设计原则一 1、找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起把会变化的部分取出来...

  • 设计模式01-策略者设计模式

    @[toc] 策略者设计模式 主要来源Head First设计模式(书) 书中定义:策略者设计模式定义了算法族,分...

  • 1.设计模式入门-策略模式

    《HEAD FIRST 设计模式》在第一章设计模式入门中介绍了策略模式(Strategy Pattern)。 定义...

  • 《Head First 设计模式》——策略模式

    策略模式就是将变化的那部分行为抽离出来进行封装。行为抽象成一个接口,具体的行为实现去实现这个接口。依赖接口,组合代...

  • 《Head First设计模式》-策略模式

    1.定义 策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 2...

  • 2018-12-11

    head first html css word书籍 http权威指南 head first设计模式

  • 《Head First设计模式》-简单易懂的策略模式

    本文章出自《Head First设计模式》读后感 策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来...

  • Head First 设计模式(1)-----策略模式

    本文参照《Head First 设计模式》,转载请注明出处对于整个系列,我们按照这本书的设计逻辑,使用情景分析的方...

网友评论

      本文标题:Head First 策略模式

      本文链接:https://www.haomeiwen.com/subject/twrloftx.html