zoukankan      html  css  js  c++  java
  • Head First 设计模式 第1章 策略模式

    本章从浅入深的讲解了策略模式的使用,以及策略模式中所涉及到的几个设计原则,在本章的最后给出了策略模式的定义。

     1、定义及优点

      什么是策略模式呢?

        答:定义算法族(对象),分别封装起来,让他们之间可以相互替换。

      优点:算法(对象)的变化独立于使用算法的客户

      如果,没有看本章前面的东西,直接给我这么一个定义,我也不明白这说的是什么意思。然而,如果你读了前面的东西,在来看这个定义就很简单了。

      通俗来说就是(我个人的理解),把相互独立的东西独立出来,单独定义成算法(也就是对象,java世界中万物皆对象),然后在另一对象要使用该算法的时候直接引用该算法,这样,当算法发生变化或者引用另一个算法时,不会影响到使用算法的客户(也就是刚才说的引用算法的对象)。

      以上就是我自己理解的策略模式,这种模式在你理解之后,会发现,实际的工作或学习过程中,我们在很多地方会用到策略模式。比如,当你定义一个USER的时候,这个   USER中会有姓名、性别、联系方式、地址,而地址又是一个独立的对象,封装了省、市、县、街道、详细地址,你在USER中引用这个地址,即便地址修改了,也不会影响到使用  这个地址的USER,这应该就是最简单的策略模式了,相对复杂点的就是下面本书中说道的“鸭子问题”了。

      2、鸭子问题

      由于我本地并没有装visio,所以就用画图简单的画了一个“类UML图”(我们暂且这么称呼它吧)。

      右下方的QuackBehavior是封装的呱呱叫行为,忘标注了。;-)

      

      “类UML图”说明:

        鸭子本身会有颜色,并且自身会游泳,所以游泳直接在基类中实现(因为所有鸭子都会游泳),而鸭子的颜色需要子类来实现(毕竟所有的鸭子并不是同一个颜色的);

        然而有的鸭子在自觉不自觉的过程中学会了飞行(实际是滑翔),而有的鸭子依旧不会这项本领;还有的鸭子出生只会呱呱叫有的是吱吱叫还有得生病了不会叫。

        1、这时候,在定义飞行跟叫的时候,考虑到不同的鸭子行为是不一样的,第一时间想到的是继承,然而如果继承字基类Duck,那么在子类中会出现大量的重复代码(有部  分鸭子是会飞的,有部分是不会飞的;大部分鸭子是呱呱叫),所以这时候要考虑把这些重复的代码抽取出来,独立封装,就得到了相对应的飞行/叫的行为。

        2、如果,不同的行为定义为不同的类,会发现,在鸭子类中引用会很麻烦。这时候就考虑到了面向接口编程,只管接口,而不需要去考虑具体实现,这样,只需要在鸭子  中引入接口即可,在运行时将飞行行为动态绑定到鸭子上。

        通过上面两步分析,我们终于比较完美的实现了这个过程,这就是策略模式。

      3、涉及到的设计原则

        A)、找出代码中需要变化之处,把他们独立出来,将其与不需要变化的代码相分离,以便日后可以轻易的改动和扩充;

          <不同的鸭子,它的飞行和叫可能是不一样的,并且可能有的鸭子不会飞也不会叫,而有的鸭子即会飞也会叫>

        B)、面向接口编程,而不是面向实现编程。

          <说明:这里的接口,不是Java中实际意义的Interface,关键在于Java的多态。你可以面向接口、抽象类编程>

        C)、更多的去使用组合代替继承。

          <HAS-A 要优于 IS-A,因为HAS-A可以在运行时动态改变其行为而不影响调用该行为的对象。鸭子有一个飞行和叫的行为,而不是让所有的鸭子去继承自基类的行  为>

    关于第1章的策略模式就介绍到这里,如果以上内容有出错的地方,还请不吝赐教,大家共同学习。

    第2章的观察者模式会在最近几天更新....

    转载请注明出处,谢谢!

      

  • 相关阅读:
    SQL注入: with rollup特性
    【转】kali配置--修改IP和DNS
    【转】getopt模块,实现获取命令行参数
    socket编程: TypeError: must be bytes or buffer, not str
    Ansible进阶之企业级应用
    Ansible之Playbook详解
    Ansible之常用模块介绍
    JAVA企业级应用Tomcat实战
    ubuntu网络、包管理、工作内容小结
    shell细节决定高度
  • 原文地址:https://www.cnblogs.com/edi-kai/p/4707926.html
Copyright © 2011-2022 走看看