`
bobo19841121
  • 浏览: 1466 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

HeadFirstDesignPatterns笔记

阅读更多

                                      HFDP浪漫史1 

     今天看了下HFDP觉得的有必要记一记不然以我的记性肯定忘的精光。放在网上以备不测。言归正转第一章开始了。看了第一章下来半天也摸不着头脑.- -!看来我的设计头脑还不是一般的烂。看到最后一节终于看到了一个 STRATEGY pattern.原来就是传说中的策略模式。看看它是怎么出现的吧。例子一来又是可爱的DUCK(ps:鸭子是无辜的不要老拿它们开玩笑).好的例子来了。

     XX公司做了个关于鸭子的GAME(- -还真是无聊) 一个父类duck:

    

public abstract class Duck()
{//传说中的鸭王类
  public void  quack();
   public void  swim();
   public void  display();
}

   然后后面跟着一票子鸭类,什么橡皮鸭了,家鸭了,野鸭。程序跑的好好的。结果新的需求来了。要求鸭子多一个能飞的行为。按照常理给鸭王类加了给fly()的方法。结果呢当然所有的鸭子都会飞了,一只橡皮鸭在天上飞着!写代码的人当然遭人批了。没办法只有改了,重载出现了。在橡皮鸭的类中重载fly()这个方法。橡皮鸭的问题解决了。木头鸭的问题又来了。木头鸭只能显示和游泳,不能飞也不能叫啊。怎么办?重载quack()和fly()两个方法。那么石头鸭呢?幽灵鸭呢?完蛋重载一大堆,头开始疼了,看来办法行不通了赶紧换换思路了。interface出场了。看看那人是怎么处理的?

  写了一个Flyable()和Quackable()的接口。Duck类只保存swim()和display()两个方法。然后所以类要继承Duck类和实现Flyable()和Quackable()两个接口。显然又是愚蠢的人类啊。‘重复代码这么多,你想死啊~’电话那头传来了应该传来的声音。改改改!开始冷静的分析问题了。让我们从头分析下问题吧。

              Separating what changes from what stays the same.看了上面这句话就知道我们将要做什么了。分析一下需求吧。所有的鸭子都有能够display和swim(PS:是他们这么定的,幽灵鸭也可以看的见吗?

- -!)那么好了将这两个方法留在最初的Duck类中。其他两个行为被抽象出来与原始类分离。现在我们创建两个interface.分别是flyBehavior()和quackBehavior()。当然接口中要放入方法了,在flyBehavior()中我们加入fly()方法。在quackBehavior()中加入quack()的方法。接下来做什么呢?当然要实现这两个接口了。华丽的实现吧把你能想的如何如何飞和如何如何叫都写出来吧。先写两个fly的实现类吧,一个叫FlyWithWings()另一个叫做FlyNoWay()这两个实现类就包含了用翅膀飞和不能飞两种有关飞的行为。当然你还可以加上什么FlyUseRocket之类的飞行方法啦。反正飞行行为实现了。接下来写几个quack的实现类。first就写个Quack类说明是真的可以叫的哦。and then写个squeak类说明不是真的鸭子叫了,不过也能叫。last写个MuteQuack()沉默的鸭子啊~不能叫了。当然你还可以开动脑筋想些叫的方式。你应该发现一点了吧,那么就是这些行为已经不会约束于duck类了,完全的脱离了最原始的类,那么假使你再写个dog类啊,cat类啊,dragon类啊都可以用这些行为了,你要是有新的行为也可以完全独立的新增。接下来把行为放入duck类中去吧。在duck中加入这两个接口,并为行为加上set的方法,方便与你动态的改变fly或是quack的行为。那么改装后的duck类应该是这样的:

   

package entity;

import Behavior.FlyBehavior;
import Behavior.QuackBehavior;

/**
 *
 *@copyright      Copyright  Saptac
 *@company        Saptac
 *@createDate     2008-7-22
 *@lastModifier   CB
 *@lastModifyDate 2008-7-22
 *@author         CB
 *@version        1.0
 */
public abstract class Duck{
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;
    public abstract void display();
    public abstract void swim();
    public void performFly()
    {
        flyBehavior.fly();
    }
    public void performQuack()
    {
        quackBehavior.quack();
    }
    /**
     * @param flyBehavior the flyBehavior to set
     */
    public void setFlyBehavior(FlyBehavior flyBehavior)
    {
        this.flyBehavior = flyBehavior;
    }
    /**
     * @param quackBehaviorthe quackBehavior to set
     */
    public void setQuackBehavior(QuackBehavior quackBehavior)
    {
        this.quackBehavior= quackBehavior;
    }
    
}

 

    下面魔术就开始了。(continue............)

 

    

 

分享到:
评论

相关推荐

    基于HeadFirstDesignPatterns的Java设计模式学习源码笔记

    该项目是针对《HeadFirstDesignPatterns》设计模式书籍的Java实现源码笔记,总计包含771个文件,其中以Java源文件为主,共计711个,辅以少量C/C++语言代码和Markdown文档,旨在帮助开发者深入理解并掌握Java设计模式...

    笔记记录分享-笔记记录分享网站-笔记记录分享网站源码-笔记记录分享网站java代码-基于springboot的笔记记录分享网站

    笔记记录分享-笔记记录分享网站-笔记记录分享网站源码-笔记记录分享网站java代码-笔记记录分享网站设计与实现-基于springboot的笔记记录分享网站-基于Web的笔记记录分享网站设计与实现-笔记记录分享项目-笔记记录...

    微信小程序 云笔记 (源码)

    微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小...

    狂神SpringBoot笔记+源码

    狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神...

    小程序源码 云笔记 (代码+截图)

    小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+...

    有道云笔记如何调整窗口大小?.docx

    有道云笔记窗口大小调整技巧 在使用有道云笔记时,调整窗口大小是非常重要的操作。合理的窗口大小设置可以提高工作效率和阅读体验。本文将介绍如何调整有道云笔记的窗口大小,提高笔记编辑和阅读体验。 一、调整...

    2020谷粒商城笔记资料,文档课件笔记+源代码(基础篇+高级篇

    2020谷粒商城笔记资料,谷粒商城2020文档课件笔记+源代码(基础篇+高级篇) 谷粒商城2020文档课件笔记+源代码(基础篇+高级篇) 2020谷粒商城笔记资料(基础篇+高级篇) 尚硅谷谷粒商城笔记,很全。基础篇,高级篇...

    基于SSM框架+mysql搭建的云笔记系统(仿有道云笔记)源码.zip

    基于SSM框架+mysql搭建的云笔记系统(仿有道云笔记)源码.zip基于SSM框架+mysql搭建的云笔记系统(仿有道云笔记)源码.zip基于SSM框架+mysql搭建的云笔记系统(仿有道云笔记)源码.zip基于SSM框架+mysql搭建的云笔记...

    大物上册手写笔记.pdf

    【大物上册手写笔记.pdf】是一份来自西电大学的高质量物理学习资料,主要涵盖了大学物理上册的内容。这份笔记由一位期末成绩达到90分以上的同学编写,因此具有很高的参考价值,适合学生在期末复习时使用。笔记内容...

    为知笔记4.2.476免登录

    《为知笔记4.2.476免登录——本地存储与便捷知识管理》 为知笔记,全称为“WizNote”,是一款受到广大用户喜爱的个人知识管理工具。其4.2.476版本提供了免登录的功能,这对于那些希望在不登录账户的情况下仅进行...

    狂神笔记,b站狂神说课程笔记大全(最新)

    b站狂神说课程笔记大全,每个部分都有 狂神说java系列笔记(java基础+javaweb+ssm+微服务)全套 狂神说上课笔记未删减 Java基础到技术升级 1、JavaSE:Java入门 2、JavaSE:基础语法 3、JavaSE:流程控制 4、JavaSE...

    为知笔记开源项目程序源码,实现云笔记功能需要自己搭建服务器

    为知笔记开源项目程序源码,实现云笔记功能需要自己搭建服务器 为知笔记开源项目程序源码,实现云笔记功能需要自己搭建服务器 为知笔记开源项目程序源码,实现云笔记功能需要自己搭建服务器 为知笔记开源项目程序...

    基于SSM框架+mysql搭建的云笔记系统(仿有道云笔记)源码+项目说明.zip

    基于SSM框架+mysql搭建的云笔记系统(仿有道云笔记)源码+项目说明.zip 基于SSM框架+mysql搭建的云笔记系统(仿有道云笔记)源码+项目说明.zip 基于SSM框架+mysql搭建的云笔记系统(仿有道云笔记)源码+项目说明.zip...

    Java相关课程系列笔记之九Servlet学习笔记

    Java相关课程系列笔记之一Java学习笔记 Java相关课程系列笔记之四JDBC学习笔记 Java相关课程系列笔记之六HTML学习笔记 Java相关课程系列笔记之七CSS学习笔记 Java相关课程系列笔记之八JavaScript学习笔记 Java相关...

    2022吴恩达机器学习笔记汇总(共10章节).zip

    2022吴恩达机器学习笔记汇总(共10章节).zip2022吴恩达机器学习笔记汇总(共10章节).zip2022吴恩达机器学习笔记汇总(共10章节).zip2022吴恩达机器学习笔记汇总(共10章节).zip2022吴恩达机器学习笔记汇总(共10章节).zip...

    软考中级笔记,系统集成项目管理工程师笔记.zip

    软考中级笔记,本人自己学习过程中记录的笔记内容。 课程学的是马老师的课程。参照此笔记默认有马老师的教程,或已对课本知识点内容有基础认识,本笔记也只是作为后期知识巩固和做题时辅助使用,前期肯定比较粗,...

    oracle adg安装个人笔记

    oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记oracle adg安装个人笔记...

    数据结构高分笔记part1

    这份“数据结构高分笔记part1”显然是为了帮助备考研究生入学考试的专业学生准备的,旨在提供深入的数据结构理解,助力他们在考试中取得优异成绩。 笔记可能涵盖以下几个关键知识点: 1. **基本概念**:首先,笔记...

    微信小程序——云笔记(截图+源码).zip

    微信小程序——云笔记(截图+源码).zip 微信小程序——云笔记(截图+源码).zip 微信小程序——云笔记(截图+源码).zip 微信小程序——云笔记(截图+源码).zip 微信小程序——云笔记(截图+源码).zip 微信小程序...

Global site tag (gtag.js) - Google Analytics