《Head First 设计模式》读书笔记

本书《Head First 设计模式》深入介绍了多种设计模式,包括策略模式、观察者模式和装饰者模式等。设计原则如针对接口编程、多用组合少用继承等贯穿其中。策略模式强调将算法封装,使客户可以灵活选择。观察者模式实现了一对多的依赖关系,方便对象状态变化时的通知。装饰者模式则动态地扩展对象功能,保持了类的开放封闭原则。通过这些模式,开发者可以更好地设计可维护、可扩展的系统。

第一章 设计模式入门 策略模式(Strategy Pattern)

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

  • 设计原则二:针对接口编程,而不是针对实现编程。P11
    针对接口编程真正的意思是针对超类型(supertype)编程。这里的“接口”有多个含义,接口是一个“概念”,也是一种Java的Interface构造。针对接口编程,关键就在多态。利用多态,程序可以针对超类型编程,执行时会根据实际状况执行到真正的行为,不会被绑死在超类型的行为上。“针对超类型编程”这句话,可以更明确地说成“变量的声明类型应该是超类型,通常是一个抽象类或者是一个接口,如此,只要是具体实现此超类型的类所产生的对象,都可以指定给这个变量。这也意味着,声明类时不用理会以后执行时的真正对象类型!”

  • 设计原则三:多用组合,少用继承。 P23
    使用组合建立系统具有很大的弹性,不仅可将算法族封装成类,更可以在运行时动态地改变行为,只要组合的行为对象符合正确的接口标准即可。

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

第二章 观察者模式(Observer)

观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

设计原则四:为了交互对象之间的松耦合设计而努力。

第三章 装饰者模式

设计原则五:类应该对扩展开放,对修改关闭。

装饰者模式特点:

  • 装饰者和被装饰对象有相同的超类型。

  • 既然装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它。

  • 装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。

  • 对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。

装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

第四章 工厂模式

所有工厂模式都用来封装对象的创建。工厂方法模式(Factory Method Pattern)通过让子类决定该创建的对象是什么,来达到将对象的创建过程封装的目的。

工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。P134

设计原则六:依赖倒置原则(Dependency Inversion Principle),要依赖抽象,不要依赖具体类。
这个原则说明了:不能让高层组件依赖低层组件,而且,不管高层或低层组件,“两者”都应该依赖于抽象。

第五章 单件模式(Singleton Pattern)

单件模式:确保一个类只有一个实例,并提供一个全局访问点。

类图:P177

处理多线程:
1. 把getInstance()变成同步(synchronized)方法
2. 使用“急切”创建实例,而不用延迟实例化的做法
3. 用“双重检查加锁”,在getInstance()中减少使用同步

第六章 命令模式

命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。P206

一个命令对象通常在特定接受者上绑定一组动作来封装一个请求。要达到这一点,命令对象将动作和接受者包进对象中。这个对象只暴露出一个execute()方法,当此方法被调用的时候,接收者就会进行这些动作。从外面来看,其他对象不知道究竟哪个接收者进行了哪些动作,只知道如果调用execute()方法,请求的目的就能达到。

空对象(Null Object) P214

第七章 适配器模式与外观模式

适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。P243

两种适配器:“对象”适配器和“类”适配器(多重继承)

模式对比:

  • 装饰者:不改变接口,但加入责任
  • 适配器:将一个接口转换成另一个接口
  • 外观:让接口更简单

外观模式(Facade Pattern):提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

设计原则七:最少知识(Least Knowledge)原则,只和你的密友谈话。

最少知识原则告诉我们,要减少对象之间的交互,只留下几个“密友”。这是说,当你正在设计一个系统,不管是任何对象,你都要注意它所交互的类有哪些,并注意它和这些类是如何交互的。

第八章 模板方法模式

模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。P286

模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。P289

钩子(hook)是一种被声明在抽象类中的方法,但只有空的或者默认的实现。钩子的存在,可以让子类有能力对算法的不同点进行挂钩。要不要钩子,由子类决定。

钩子的用途:
1. 钩子可以让子类实现算法中可选的部分,或者在钩子对于子类的实现并不重要的时候,子类可以对此钩子置之不理。
2. 让子类能够有机会对模板方法中某些即将发生的(或刚刚发生的)步骤作出反应。

设计原则八:好莱坞原则,别调用(打电话给)我们,我们会调用(打电话给)你。

在好莱坞原则之下,我们允许低层组件将自己挂钩到系统上,但是高层组件会决定什么时候和怎样使用这些低层组件。换句话说,高层组件对待低层组件的方式是“别调用我们,我们会调用你”。

模式对比:

  • 模板方法:子类决定如何实现算法中的步骤
  • 策略:封装可互换的行为,然后使用委托来决定要采用哪一个行为
  • 工厂方法:由子类决定实例化哪个具体类

第九章 迭代器与组合模式

迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

设计原则九:一个类应该只有一个引起变化的原因。

组合模式(Composite Pattern):允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。P356

第十章 状态模式

状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。 P410

当状态转换时固定的时候,就适合放在Context中;然而,当转换时更动态的时候,通常就会放在状态类中。将状态转换放在状态类中的缺点是:状态类之间产生了依赖。

第十一章 代理模式

代理要做的:控制和管理访问。

代理模式:为另一个对象提供一个替身或占位符以控制对这个对象的访问。 P460

几种代理控制访问的方式:

  • 远程代理控制访问远程对象
  • 虚拟代理(Virtual Proxy)控制访问创建开销大的资源 P462
  • 保护代理基于权限控制对资源的访问 P474

远程代理可以作为另一个JVM上对象的本地代表。调用代理的方法,会被代理利用网络转发到远程执行,并且结果会通过网络返回给代理,再由代理将结果转给客户。

虚拟代理作为创建开销大的对象的代表。虚拟代理经常直到我们真正需要一个对象的时候才创建它。当对象在创建前和创建中时,由虚拟代理来扮演对象的替身。对象创建后,代理就会将请求直接委托给对象。

其他类型的代理:

防火墙代理(Firewall Proxy):控制网络资源的访问,保护主题免于“坏客户”的侵害。

智能引用代理(Smart Reference Proxy):当主题被引用时,进行额外的动作,例如计算一个对象被引用的次数。

缓存代理(Caching Proxy):为开销大的运算结果提供暂时存储,它也允许多个客户共享结果,以减少计算或网络延迟。

同步代理(Synchronization Proxy):在多线程的情况下为主题提供安全的访问。

复杂隐藏代理(Complexity Hiding Proxy):用来隐藏一个类的复杂集合的复杂度,并进行访问控制。有时候也称为外观代理(Facade Proxy),这不难理解。复杂隐藏代理和外观模式是不一样的,因为代理控制访问,而外观模式只提供另一组接口。

写入时复制代理(Copy-On-Write Proxy):用来控制对象的复制,方法是延迟对象的复制,知道客户真的需要为止。这是虚拟代理的变体。

第十二章 复合模式

复合模式(Compound Pattern)

MVC(Model-View-Controller)

  • 视图:用来呈现模型。视图通常直接从模型中取得它需要显示的状态与数据。
  • 模型:模型持有所有的数据、状态和程序逻辑。模型没有注意到视图和控制器,虽然它提供了操纵和检索状态的接口,并发送状态改变通知给观察者。
  • 控制器:取得用户的输入并解读其对模型的意思。 P530

MVC使用的设计模式: P532

  • 模型利用“观察者”让控制器和视图可以随最新的状态改变而更新。
  • 视图和控制器实现了“策略模式”。控制器是视图的行为,如果你希望有不同的行为,可以直接换一个控制器。
  • 视图内部使用组合模式来管理窗口、按钮以及其他显示组件。

第十三章 与设计模式相处

定义设计模式:模式是在某情境(context)下,针对某问题的某种解决方案。

  • 情境就是应用某个模式的情况。
  • 问题就是你想在某情境下达到的目标,但也可以是某情境下的约束。
  • 解决方案就是你所追求的:一个通用的设计,用来解决约束、达到目标。

模式分类:

  1. 创建型模式设计到将对象实例化,这类模式都提供一个方法,将客户从所需要实例化的对象中解耦。包括:Singleton, Builder, Prototype, Abstract Factory, Factory Method.
  2. 行为型模式都涉及到类和对象如何交互及分配职责。包括:Template Method, Iterator, Command, Observer, State, Strategy, Visitor, Mediator, Memento, Interpreter, Chain of Responsibility.
  3. 结构型模式可以让你把类或对象组合到更大的结构中。包括:Decorator, Composite, Proxy, Facade, Adapter, Bridge, Flyweight.

附录A 剩下的模式

  1. 桥接模式(Bridge Pattern)
  2. 生成器模式(Builder Pattern)
  3. 责任链模式(Chain of Responsibility Pattern) P616
  4. 蝇量模式(Flyweight Pattern) P618
  5. 解释器模式(Interpreter Pattern) P620
  6. 中介者模式(Mediator Pattern) P622
  7. 备忘录模式(Memento Pattern) P624
  8. 原型模式(Prototype Pattern) P626
  9. 访问者模式(Visitor Pattern) P628
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值