Head First 设计模式 读书笔记

1. 策略模式

  • 例子:一个鸭子类的飞翔行为:不能飞;正常飞;火箭助推…(都实现飞翔接口)。我们在鸭子类中增加一个飞翔行为对象。通过设置具体鸭子(继承于鸭子类)的飞翔行为对象,描述它的具体飞翔方式
  • 定义:定义算法族,封装起来,可以相互替换,让算法的变化独立于使用算法的客户。

2. 观察者模式

  • 主题类中有一个观察者列表。当有消息更新,就会通知所有观察者。
  • 观察者类中有主题类对象,构造方法中进行注册(增加到列表中)
  • 观察者实现了一个统一的接口,接口中有update方法。以供主题类通知观察者时调用。

3. 装饰者模式

  • 装饰者 和 被装饰者 的类型一样(经过接口或继承实现)
  • 装饰者可以加上自己的行为,甚至取代掉被装饰者的行为。
  • 例子:【咖啡类】和【豆浆类】都继承【饮料类】,饮料类中有cost方法,返回价格。用豆浆类包装咖啡类,具体在豆浆类中存在一个【饮料类成员变量】,构造时传入咖啡类,cost方法返回豆浆价格和成员变量的cost和。这样就知道了加入豆浆的咖啡价格。可以以此类推,不断套娃。

4. 工厂模式

  • 简单工厂不是一个设计模式。把new操作替换成工厂对象的创建方法。
  • 工厂模式中实例化的责任被移到一个“抽象方法”中,此方法就如同一个“工厂”;子类去实现这个方法,实现对象的实例化。
  • 工厂模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
  • 简单工厂把全部的事情,在一个地方都处理完了,然后工厂方法却是创建一个框架,让子类决定要如何实现。
  • 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。这个抽象类就可以生产A原料,B原料,C原料,要啥就从其中获取就行

5. 单例模式

  • 实现方案1:有一个静态私有成员变量;有一个私有构造方法;有一个静态方法,可以调用私有的构造方法,返回实例。【非线程安全】
  • 定义:确保一个类只有一个实例,并提供一个全局访问点
  • 线程安全的实现方法2:将方案1的静态方法加上synchronized关键字【不好,但可以用】【同步降低性能;只有第一次执行此方法时才真正需要同步】
  • 【急切创建实例,线程安全实现方案3】:一个私有构造方法;静态的私有成员变量=调用构造方法;静态的方法能够返回上述成员变量。【JVM保证了线程安全】
  • 【线程安全的最好的实现方案4】:一个私有静态成员变量;一个私有的构造方法;一个静态方法,先判断是否创建了,没有的话,加锁,然后再判断一次,如果没有的话,创建。【为什么双重判断,线程1发现没创建,想得到锁去创建。线程2发现没创建,想得到锁去创建。线程1得到锁,创建了,失去锁。线程2得到锁,需要再次判断,否则就不是单例了】

6. 命令模式:

  • 将动作封装成命令对象,然后随心所欲地存储、传递、调用他们。
  • 这些命令对象都实现了统一的命令接口。【面向接口编程的思想】

7. 设配器模式:

  • 将一个类的接口,转换成客户期望的另一个接口。

8. 外观模式

  • 定义了一个高层接口,让子系统更容易使用。【就是不直接命令各位小弟,直接命令一个领班,领班的自己去命令各位小弟】比如,我想看电视,直接调用wachTV就行,这个方法会去调用:打开电视,放CD,准备爆米花…

9. 模板方法模式

  • 定义一个算法的大纲,由子类定义某些步骤的内容。这样,算法中个别步骤有不同的实现细节,但是算法的结构依然维持不变。
  • 工厂方法是模板方法的一种特殊版本。【其实就是把创建方法延迟到子类中实现】

10. 迭代器模式

  • 提供一种方法顺序访问一个聚合对象的各个元素,而又不暴露其内部的表示。
  • jdk中Collection返回Iterator就是完全利用了这个设计模式。
  • 把游走的任务放在迭代器上,而不是聚合上。 就像你有一个ArrayList,生成一个Iterator对象,用迭代器对象去遍历。而不是用ArrayList对象去实现遍历。这是一种高内聚的一种思想。

11. 组合模式

  • 将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
  • 数个对象的集合,彼此之间有“整体/部分”的关系,并且你想用一致的方式来对待这些对象时,就需要组合模式。
  • 这样客户就不用操心面对的是组合对象还是叶节点对象。不用写一大堆if语句来判断,只需要对整个结构调用一个方法并执行操作就可以了。

12. 状态模式

  • 我有一个糖果机器。
  • 有一个State接口,接口中有很多动作,有很多实现了State的实现类:无币,有币,出售,售罄等等。
  • 糖果机器中有这些状态成员变量,有一个现状态成员变量,指定现在的状态。
  • 这样,当糖果机器做什么动作,就调用nowState来进行动作:转换状态,或者做动作什么的。
  • 具有相同类图的策略模式,在创建糖果机器的时候就指定了nowState是哪一个状态,机器做动作就调用指定的那个状态来做动作。【这就是不同点】
  • 状态模式策略模式目的的不同点:策略模式是除了继承之外一种弹性替代方案。状态模式是不用放置很多条件判断的替代方案,进行状态的游走。

13. 代理模式

  • 使用代理模式创建代表,让代表对象控制某对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或需要安全控制的对象。
  • java中有动态代理技术。可以在运行时动态地创建一个代理,将方法的调用转发到你所指定的类。【Proxy代理对象不是你直接实现的。用Proxy.newProxyInstance来生成,同时传入一个handler对象(构造传入真正的对象)(代理的任何方法都调用它的invoke方法)】
  • 【Mason:代理模式和装饰者模式看上去很像】

14. 复合模式

  • 结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题。
  • MVCModel 2 属于复合模式
  • MVC是复合模式,结合了观察者模式,策略模式和组合模式。
  • Model 2 是MVC在Web上的应用
  • 在Model 2 中,控制器实现成Servlet,而JSP/HTML实现视图

猜你喜欢

转载自blog.csdn.net/Mason97/article/details/108945513