一、设计原则

  1. 封装变化
  2. 多用组合,少用继承
  3. 针对接口编程,不针对实现编程
  4. 为交互对象之间的松紧耦合设计而努力
  5. 对扩展开放,都修稿关闭
  6. 依赖抽象,不要依赖具体类
  7. 最少知识原则:之和朋友交谈
  8. 好莱坞原则:别找我,我会找你(由超类主控一切,当他们需要的时候,自然回去调用子类)
  9. 类应该只有一个改变的理由

二、设计模式

  1. 策略模式

定义算法族,分别封装起来,让他们之间可以互相替换,次模式让算法的变化独立于使用算法的客户

 
     2. 观察者模式
          在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新
 
     3. 装饰者模式
          动态的将责任附加到对象上。想哟啊扩展功能,装饰者提供有别于继承的另一种选择
      要点:
  • 继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式
  • 在我们的设计中,应该允许行为可以被扩展,而无需修改现有的代码
  • 组合和委托可用于在运行时动态地加上新的行为
  • 除了继承,装饰者模式也可以让我们扩展行为
  • 装饰者模式意味着一群装饰者类,这些类用来包装具体组件
  • 装饰者类反应出被装饰者的组件类型(事实上,他们具有相同的类型,都是经过接口或继承实现)
  • 装饰者可以被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的
  • 可以用无数个装饰者包装一个组件
  • 装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型
  • 装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得复杂
 
     4.
      抽象工厂模式:
          提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
     工厂方法模式:
          定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类
     要点:
  • 所有的工厂都是用来封装对象的创建
  • 简单工厂,虽然不是真正的设计模式,但是仍不失为一个简单的方法,可以将客户程序从具体类解耦
  • 工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象
  • 抽象工厂使用对象组合:对象的创建被实例化在工厂接口所暴露出来的方法中
  • 所有工厂模式都通过减少用功程序的具体类之间的依赖促进松紧耦合
  • 工厂方法允许类将实例化延迟到子类进行
  • 抽象工厂创建相关的对象家族,而不需要依赖他们的具体类
  • 依赖倒置原则,指导我们避免依赖具体类型,而尽量依赖抽象
  • 工厂是很有威力的技巧,帮助我们针对抽象编程,而不要针对具体类型编程
     5.单件(例)模式
          确保一个类只有一个实例,并提供全局访问点
     要点:
  • 单件模式确保程序中一个类最多只有一个实例
  • 单件模式也提供访问这个实例的全局点
  • 在Java中实现单件模式需要私有化构造器,一个静态方法和一个静态变量
  • 确定在性能和资源上的限制,然后小心地选择适当的方案来实现的那件,以解决多线程的问题
  • 如果使用多个类加载器。可以导致单件失效而产生多个实例
  • 如果使用JVM1.2或之前的版本,必须建立注册表,以免垃圾收集器将的单件回收
     6.命令磨时间哦
          将请求封装成对象,这可以让你使用不同的情iqu,队列,或者日志请求来参数化其他对象。命令模式也可以支持撤销操作
     要点:
  • 在被解耦的两者之间是通过命令对象昂进行沟通的,命令对象封装了接受者和一个或一组动作
  • 调用者通过调用命令对象的execute()发出请求,这会使得接受者的动作被调用
  • 调用者可以接受命令当作参数,甚至在运行时动地进行
  • 命令可以支持撤销,做法是实现一个undo()方法来回到execute()被执前的状态
  • 宏命令是命令的一种简单延伸,允许调用多个命令。宏方法也可以支持撤销
  • 实际操作时,很常见使用“聪明”对象,也就是直接实现了请求,而不是将工作委托给接受者
  • 命令也可以用来实现日志和事物系统
     
     7.
     适配器模式:
          将一个类让接口,转换成客户期望的另一个接口。适配器让原本不兼容的类可以合作无间
     外观模式:
          提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易调用
     要点:
  • 当需要使用一个现有的类而其接口并不符合你的需要时,就是用适配器
  • 当需要简化并同意一个很大的接口或者一群复杂的接口时,使用外观
  • 适配器改变接口以符合客户的期望
  • 外观将客户从一个复杂的子系统中解耦出来
  • 实现一个适配器可能需要一番功夫,也可能不费功夫,视目标接口的大小与复杂度而定
  • 实现一个外观,需要将子系统组合外观中,然后将工作委托给子系统执行
  • 适配器模式有两种形式:对象适配器和类适配器。类适配器需要用到多重继承(Java不支持多重继承)
  • 适配器将一个对象包装起来一改变接口;装饰者将一个对象包装起来以增加新的行为和责任;外观将一群对象“包装”起来以简化其接口
 
     8.模板方法模式
          在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法是的子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤
     要点:
  • “模板方法”定义了算法的步骤,把这些步骤的实现延迟到子类
  • 模板方法为我们提供了一种代码复用的重要技巧
  • 模板方法的抽象类可以定义具体方法,抽象方法和钩子
  • 抽象方法由子类实现
  • 钩子是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它
  • 为了防止子类改变模板方法中的算法,可以将模板方法声明为final
  • 好莱坞原则告诉我们,将决策权放在高层模板中,以便决定如何以及何时调用低层模板
  • 你将在真是世界代码中看到模板方法模式的多变体,不要期待他们全都是一眼就可以被你认出来的
  • 策略模式和模板方法模式都封装算法,一个用组合,一个用继承
  • 工厂方法是模板方法的一种特殊版本
     
     9. 
     迭代器模式:
          提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示
     组合模式:
          允许你将对象组成树形结构来表示“整体/部分”的层次结构。组合能让客户以一致的方式处理个别对象和对象组合
     要点:
  • 迭代器允许访问聚合的元素,而不需要暴露他的内部结构
  • 迭代器将遍历聚合的工作封装进一个对象中
  • 当使用迭代器的时候,我们依赖聚合提供遍历
  • 迭代器提供了一个通用的接口,让我们遍历聚合的项,当我们编码使用聚合的项时,就可以使用多态机制
  • 我们应该努力让一个结构,可同时包容个别对象和组合对象
  • 组合模式允许客户对个别对象及组合对象一视同仁
  • 组合结构内的任意对象称为组件,组件可以是组合,也可以是叶节点
  • 在实现组合模式时,有许多设计上的折中。你要根据组要平衡透明性和安全性
 
     10. 状态模式
          允许对象在内部状态改变是改变他的行为,对象看起来好像修改的他的类
     要点:
  • 状态模式允许一个对象基于内部状态而拥有不同的行为
  • 和程序状态机不同,状态模式用类代表状态
  • context会将行为封装进一个类,我们把以后需要做的任何改变局部化了
  • 状态模式和策略模式有相同的类图,但是他们的意图不同
  • 策略模式通常或用行为域算法类配置context类
  • 状态模式允许context随着状态的改变而改变行为
  • 状态转换可以由state类或context类控制
  • 使用状态 模式通常会导致设计中类的数目大量增加
  • 状态类可以被多个context实例共享
 
     11. 代理模式
          为另一个对象提供一个替身或占位符以访问这个对象
     要点:
  • 代理模式为另一个对象提供代表,以便控制客户对对象的访问,管理访问的方式有许多种
  • 远程代理客户和远程对象之间的交互
  • 虚拟代理控制访问实例化开销大的对象
  • 保护代理基于调用者对对象方法的访问
  • 代理模式有许多变体,例如:缓存代理,同步代理,防火墙代理和写入时复制代理
  • 代理在结构上类似于装饰者,但是目的不同
  • 装饰者模式为对象加上行为,而代理则是控制访问
  • Java内置的代理支持,可以根据需要建立动态代理,并将所有调用分配到所选的处理器
  • 就和其他的包装者一样,代理会造成设计中类的数量增加
 
     12. 复合模式
               复合模式结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题。(MVC,model2)
     要点:
  • MVC是复合模式,结合观察者模式,策略模式和组合模式
  • 模型使用观察者模式,以便观察者更新,同时保持两者之间的解耦
  • 控制器是视图的策咯,视图可以使用不同的控制器实现,得到不同的行为
  • 视图使用组合模式实现用户界面,用户界面通常组合了嵌套的组件,项面板,框架和按钮
  • 这些模式携手合作,把MVC模型的三层解耦,这样可以保持设计干净又有弹性
  • 适配器模式用来将新的模型适配成已有的视图和控制器
  • Model2是MVC在web上的应用
  • 在Model2中,控制器实现成Servlet,而JSP/HTML实现视图
 
 
 
 
 
 
 
 
 
 
 
 
 

HeadFirst 设计模式的更多相关文章

  1. 【Head-First设计模式】C#版-学习笔记-开篇及文章目录

    原文地址:[Head-First设计模式]C#版-学习笔记-开篇及文章目录 最近一年断断续续的在看技术书,但是回想看的内容,就忘了书上讲的是什么东西了,为了记住那些看过的东西,最好的办法就是敲代码验证 ...

  2. 《HeadFirst设计模式》读后感——对学习设计模式的一些想法

    最近看完了<HeadFirst设计模式>,GOF的<设计模式——可复用面向对象软件的基础>的创建型模式也读完了,经历了从一无所知到茅塞顿开再到充满迷惑的过程. 不得不说< ...

  3. Headfirst设计模式的C++实现——策略模式(Strategy)

    前言 最近在学习<Headfirst设计模式>,里面的例子都是Java的.但是我对Java并不熟悉,所以试着用C++来实现书中的例子. 先来看看Duck以及子类 Duck.h #inclu ...

  4. HeadFirst设计模式读书笔记--目录

    HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...

  5. headfirst设计模式(2)—观察者模式

    定义 观察者模式(有时又被称为发布(publish)-订阅(Subscribe)模式,在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察 ...

  6. headfirst设计模式(5)—工厂模式体系分析及抽象工厂模式

    先编一个这么久不写的理由 上周我终于鼓起勇气翻开了headfirst设计模式这本书,看看自己下一个设计模式要写个啥,然后,我终于知道我为啥这么久都没写设计模式了,headfirst的这个抽象工厂模式, ...

  7. headfirst设计模式swift版01

    headfirst设计模式这本书真好,准备用一个月学完.书里讲得很清楚了. 设计原则: 1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起. 2.针对接口编程,而不是针 ...

  8. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂

    简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...

  9. 【HeadFirst设计模式——开篇】

    近期在看HeadFirst,接下来的一段时间会陆续更新有关HeadFirst设计模式相关的文章.记得非常久之前在学习大话设计模式的时候,仅仅是走马观花的大致走过一遍.至于里面非常多东西都掌握的不是非常 ...

  10. HeadFirst设计模式<2>

    HeadFirst设计模式<2> 1 装饰者模式 星巴克咖啡 饮料 总结 如果说策略模式是通过组合实现弹性,那么装饰者模式就是通过继承来实现,在实现的同时,客户基本感觉不到使用了装饰者模式 ...

随机推荐

  1. JQ_浏览器窗口改变触发

    $(window).resize(function () { //当浏览器大小变化时 alert($(window).height()); //浏览器时下窗口可视区域高度 alert($(docume ...

  2. Docker容器是否可以改变世界?

    Docker容器是否可以改变世界? 2016-01-15 杜亦舒 2016年了,很多大牛开始预测技术趋势,其中一个普遍的观点我也很认同: Docker会更加流行,会改变程序世界 2015年的上半年我接 ...

  3. 移动端弹性布局--flex

    目前,Flex布局,可以简便.完整.响应式地实现各种页面布局.而且,它已得到了所有浏览器的支持,这意味着,我们能很安全地使用这项功能. 如果你对弹性网页布局感兴趣,那可别错过flex这么好用的属性哦. ...

  4. ON DUPLICATE KEY UPDATE重复插入时更新

    mysql当插入重复时更新的方法: 第一种方法: 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (c ...

  5. 关于tomcat内路径跳转的一些思考

    初学jsp+servlet时经常碰上的几个错误:404.路径正确但页面没有任何内容.样式和图片丢失. 这几个错误曾经让我在debug时头大,现在总结一下,其实它们都跟路径有关,正是因为没有处理好路径跳 ...

  6. javascript理解js中的闭包

    在javascript中变量有其作用域,如果在函数内部var一个变量,那么在函数外部一般情况下是不能被引用的. function outerFun() { ; alert(a); } ; outerF ...

  7. 深入浅出Mybatis系列(六)---objectFactory、plugins、mappers简介与配置

    上篇文章<深入浅出Mybatis系列(五)---TypeHandler简介及配置(mybatis源码篇)>简单看了一下TypeHandler, 本次将结束对于mybatis的配置文件的学习 ...

  8. 搭建Hadoop2.5.2+Eclipse开发调试环境

    一.简介 为了开发调试方便,本文介绍在Eclipse下搭建开发环境,连接和提交任务到Hadoop集群. 二.安装前准备: 1)Eclipse:Luna 4.4.1 2)eclipse插件:hadoop ...

  9. The type String cannot be constructed. You must configure the container to supply this value.

    利用 Enterprise Library 5.0 Microsoft.Practices.EnterpriseLibrary.Common Microsoft.Practices.Enterpris ...

  10. MongoDB aggregate 运用篇 个人总结

    最近一直在用mongodb,有时候会需要用到统计,在网上查了一些资料,最适合用的就是用aggregate,以下介绍一下自己运用的心得.. 别人写过的我就不过多描述了,大家一搜能搜索到N多一样的,我写一 ...