专栏首页HUC思梦的java专栏设计模式--策略模式

设计模式--策略模式

模拟鸭子项目:

不使用设计模式的方案:

传统继承方式如下:

鸭子超类:

public abstract class Duck {
    public void Quack() {
        System.out.println("~~gaga~~");
    }
    public abstract void display();
    public void swim() {
        System.out.println("~~im swim~~");
    }

}

GreenHeadDuck继承Duck :

public class GreenHeadDuck extends Duck {
    @Override
    public void display() {
        System.out.println("**GreenHead**");
    }
}

同理可有RedHeadDuck等子类

应对新的需求,看看这个设计的可扩展性

  1)添加会飞的鸭子

继承方式解决方案是:

public abstract class Duck {
        ...;
        public void Fly() {
        System.out.println("~~im fly~~");
    }    
};

问题来了,这个Fly让所有子类都会飞了,这是不科学的。

继承的问题:对类的局部改动,尤其超类的局部改动,会影响其他部分。影响会有溢出效应

继续使用继承方式解决方案是(覆盖父类方法):

public class GreenHeadDuck extends Duck {
...;
public void Fly() {
        System.out.println("~~no fly~~");
    }    
}

又有新需求,石头鸭子,填坑(每个子类都要覆盖父类的方法):

public class StoneDuck extends Duck {
....    };

超类挖的一个坑,每个子类都要来填,增加工作量,复杂度O(N^2)。不是好的设计方式

需要新的设计方式,应对项目的扩展性,降低复杂度:

  1)分析项目变化与不变部分,提取变化部分,抽象成接口+实现;

  2)鸭子哪些功能是会根据新需求变化的?叫声、飞行...

用策略模式来解决新需求

接口:

public interface FlyBehavior 
    {
    void fly();}
public    interface QuackBehavior 
    {
    void quack();};

好处:新增行为简单,行为类更好的复用,组合更方便。既有继承带来的复用好处,没有挖坑

重新设计的鸭子项目:

public abstract class Duck {
    FlyBehavior mFlyBehavior;
    QuackBehavior mQuackBehavior;
    public Duck() {    }
    public void Fly() {
        mFlyBehavior.fly();
    }
    public void Quack() {
        mQuackBehavior.quack();
    }
    public abstract void display();
    }

绿头鸭、石头鸭:

public class GreenHeadDuck extends Duck {
    public GreenHeadDuck() {
        mFlyBehavior = new GoodFlyBehavior();  //实现了飞行行为接口的类(可以多个)
        mQuackBehavior = new GaGaQuackBehavior();  //实现了叫声接口的类(可以多个)
    }
    @Override
    public void display() {...}
}

策略模式:分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为算法的变化独立于算法的使用者。

经验:多用组合来实现设计。

更详细的解释参考:http://www.cnblogs.com/zuoxiaolong/p/pattern8.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 设计模式--装饰者模式

      1)、咖啡种类:Espresso、ShortBlack、LongBlack、Decaf

    HUC思梦
  • 设计模式--外观模式

    最少知识原则:尽量减少对象之间的交互,只留几个“密友” 项目设计中就是不要让太多的类耦合在一起

    HUC思梦
  • 设计模式--命令模式

    命令模式:将请求、命令、动作等封装成对象,这样可以让项目使用这些对象来参数化其他对象。使得命令的请求者和执行者解耦

    HUC思梦
  • 【设计模式】—— 创建者模式Builder

      模式意图   一个对象的创建十分复杂,为了区分构建过程和使用过程,因此分开。使用一个Director类进行对象的创建,Builder规定了这个创建过程。 ...

    用户1154259
  • 怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版

    这么说吧,在我眼里,Java 就是最流行的编程语言,没有之一(PHP 往一边站)。不仅岗位多,容易找到工作,关键是薪资水平也到位,不学 Java 亏得慌,对吧?

    沉默王二
  • 浅析类装载 顶

    [Loaded com.guanjian.Parent from file:/E:/classload/out/production/classload/] ...

    算法之名
  • 阶段01Java基础day14常用对象03

    声明:本文为原创,作者为 对弈,转载时请保留本声明及附带文章链接:http://www.duiyi.xyz/c%e5%ae%9e%e7%8e%b0%e9%9b%...

    对弈
  • 自己平时用到的设计模式总结

    作为对象的创建模式,单例模式确保其某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。单例模式有以下特点:

    小勇DW3
  • 【设计模式-工厂相关模式】

    定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。

    Liusy
  • 设计模式之命令模式

    This pattern encapsulates a request as an object, thereby letting you parameteri...

    beginor

扫码关注云+社区

领取腾讯云代金券