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

    xiaoxiao2022-06-24  38

    第一章 设计模式入门 策略模式(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)下,针对某问题的某种解决方案。

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

    模式分类:

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

    附录A 剩下的模式

    桥接模式(Bridge Pattern)生成器模式(Builder Pattern)责任链模式(Chain of Responsibility Pattern) P616蝇量模式(Flyweight Pattern) P618解释器模式(Interpreter Pattern) P620中介者模式(Mediator Pattern) P622备忘录模式(Memento Pattern) P624原型模式(Prototype Pattern) P626访问者模式(Visitor Pattern) P628
    转载请注明原文地址: https://ju.6miu.com/read-1123765.html

    最新回复(0)