zoukankan      html  css  js  c++  java
  • 策略模式

    第一个模式:策略模式

    1.1 问题引入

    目标:我们设计了一个鸭子超类,现在有很多鸭子会继承这个超类的行为;同时我们希望有一些鸭子具有不同的行为,比如说能飞翔;

    1.2实现方案1:

    利用继承来实现Duck的行为。

    wps32AA.tmp

    对于子类中的各种鸭子,如果有不同的行为,需要Override超类的行为;

    利用继承的方法会出现以下的结果:

    wps17E.tmp

    实现方案2:因为并不是所有的鸭子都会叫或者飞翔,所以可以考虑将其提取出来,作为接口提供给子类鸭子;

    wpsC29C.tmp

    这种方法的特点:

    1.虽然Flyable与Quackable接口可以解决“一部分”问题,但是却造成代码无法复用。

    设计原则:找到应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

    设计方案3:我们知道Duck类内的fly()和quack()会随着鸭子的不同而改变。

    为了将这两个行为从Duck类中分开,我们将把它们从Duck类中取出来,建议一组新类来代表每个行为。

    设计原则:针对接口编程,而不是针对实现编程

    现在我们来实现鸭子的行为:

    wps771C.tmp

    这样的设计,可以让飞行和呱呱叫的动作被其他的对象复用了,因为这些行为类已经与鸭子无关了。

    特点:有了继承的“复用”好处,却没有继承所带来的包袱。

    Dumb question:

    wps3712.tmp

    关键在于,鸭子现在会将飞行和咕咕叫的行为“委托”别人处理,而不是使用定义在Duck类(或子类)内的咕咕叫和飞行方法。

    实现类图如下所示:

    wpsAE25.tmp

    扩张:我们向动态的设定鸭子的行为!我们向通过鸭子子类中动态地设定鸭子的行为,而不是在鸭子的构造器里实例化。

    解决方案: 在Duck类中加入两个设定方法即可

    “有一个”关系:每一个鸭子都有一个FlyBehavior和一个QuackBehavior,好将飞行和咕咕叫行为委托给他们代为处理。鸭子的行为不是通过继承来的,而是通过和适当的对象“组合”来的。

    设计原则:多用组合,少用继承

    总结:

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

  • 相关阅读:
    NO.05--谈一谈Angular 和 Vue.js 的对比。
    NO.04--我的使用心得之使用vue绑定class名
    No.03---Vue学习之路之模块化组织
    NO.02---聊聊Vue提升
    NO.01---今天聊聊Vuex的简单入门
    hello word!------为什么开通博客以及自我介绍
    JavaScript 常用正则示例
    Newtonsoft.Json(Json.Net)学习笔记
    aspx后台传递Json到前台的两种接收方法
    MVC5中后台提供Json,前台处理Json,绑定给Dropdownlist的例子
  • 原文地址:https://www.cnblogs.com/maverick-fu/p/4503459.html
Copyright © 2011-2022 走看看