推荐书籍 《人人都懂设计模式》从生活中领悟设计模式 python实现 罗伟富著
介绍有趣的设计模式,便于代码设计。
监听模式,又名观察者模式。顾名思义就是观察与被观察的关系。比如,在烧开水的时候看它开没有开。你就是观察者,水就是被观察者。其核心思想: 被观察者与观察者之间建立一种自动触发关系。观察者模式是对象的行为模式,又叫发布/订阅模式、模型/视图模式、源/监听器模式或者是从属者模式。
设计要点:(1) 要明确谁是观察者谁是被观察者。观察者与被观察者之间是多对一关系。(2)Observable在发送广播通知的时候,无需指定具体的Observer。Observer可以自己决定是否订阅Subject的通知。(3)被观察者至少需要三个方法:添加监听者、移除监听者、通知Observer的方法。观察者至少要有一个方法:更新方法,即更新当前的内容,做出相应的处理。
状态模式。一个对象在其内部状态发生改变时,其表现的行为和外在属性不一样,这个对象看上去就像改变了它的类型一样。核心思想:一个事物(对象)有多种状态,在不同的状态下所表现出来的行为和属性不一样。
设计要点:(1) 在实现状态模式的时候,实现的场景状态有时候会非常复杂,决定状态变化的因素也非常多。我们可以把决定状态变化的属性单独抽象成一个类StateInfo,这样判断状态属性是否符合当前的状态isMatch时就可以传入更多的信息。
中介模式。用一个中介对象来封装一系列的对象交互,中介对象使各对象不需要显式地像话引用,从而使爱耦合松散,而且可以独立改变它们之间的交互。
设计要点:(1) 交互对象:要进行交互的一系列对象。(2)中介者:负责协调各个对象之间的交互。(3)具体中介者:中介的具体实现。
装饰模式。动态地给一个对象增加一些额外的职责,就拓展对象功能来说,装饰模式比生成子类的方式更为灵活。
设计要点:(1) 可灵活地给一个对象增加职责或拓展功能。(2)可增加任意多个装饰。(3)装饰的顺序不同,可能产生不同的效果。
工厂模式。简单工厂模式:专门定义一个类来负责创建其他类的实例,根据参数的不同创建不同类的实例,被创建的实例通常具体共同的父类,这个模式叫简单工厂模式。实现简单,结构清晰。抽象出一个专门的类来负责某类对象的创建,分割出创建的职责。不能直接创建具体的对象,只需闯入适当的参数即可。工厂方法模式:抽象出一个父类,并增加子类分别负责创建不同的具体产品。抽象工厂模式:提供一个创建一系列相关或相互依赖的对象的接口,而无需指定它们的具体类。
单例模式。保证一个类有且只有一个对象(实例)的一种机制。单例模式用来控制某些事物只允许有一个个体。类中只有一个方法。
克隆模式。用原型实例指定要创建对象的种类,并通过拷贝这些原型的属性来创建新的对象。核心就是clone方法,拷贝副本的所有属性。(1) 分配一块新的内存空间给新的对象。(2)拷贝父本对象的所有属性。
设计要点:区分浅拷贝与深拷贝,除非一些特殊情况(如需求本身就要求两个对象一起改变),尽量使用深拷贝的方式,只有两个方法:深拷贝克隆deepClone和浅拷贝克隆Clone。
职责模式。职责模式也成为责任链模式,它将请求的发送者和接受者解耦了。客户端不需要知道请求处理者的明确信息和处理的具体逻辑,甚至不需要知道链的结构,它只需要将请求进行发送即可。
设计要点:(1)请求者与请求内容:确认谁要发送请求,发送请求的对象称为请求者。请求的内容通过发送请求时的参数进行传递。(2)有哪些责任人:责任人是构成责任链的关键要素。请求的流动方向是链条上的线,而责任人则是链条上的节点,线和节点共同构成一条链条。(3)对责任人进行抽象:真实世界上的责任人多种多样,纷繁复杂,有不同的职责和功能;但他们也有一个共同的特征---都可以处理请求。所以需要对责任人进行抽象,使他们具有责任的可传递性。(4)责任人可以自由组合:责任链上的责任人可以根据业务的具体逻辑进行自由的组合和排序。
代理模式。为其他对象提供一种代理以控制对这个对象的访问。代理模式的核心思想是:(1)使用一个额外的间接层来支持分散、可控的、智能的访问。(2)增加一个包装盒委托来宝华真实的组件,以避免过度复杂。
设计要点:(1)主题:定义操作、活动、任务的接口类 (2)真实主体:真正完成操作、活动、任务的具体类。(3)代替真实主题完成操作、活动、任务的代理类。
外观模式。将复杂的业务通过一个对接人来提供一整套统一的服务,让用户不用关心内部复杂的运行机制。这种方式在程序中叫外观模式,也叫门面模式。用一个简单的接口来封装一个复杂的系统,使这个系统更容易使用。
设计要点:(1)外观角色:为子系统封装统一的对外接口,如同子系统的门面。这个类一般不浮躁具体的业务逻辑,知识一个委托类。 (2)子系统:由多个类组成的具有某一特定功能的子系统。可以是第三方库,也可以是自己的基础库,还可以是一个子服务,为整个系统提供特点的功能或服务。
迭代模式,也称为迭代器模式。
设计要点:(1)了解容器的数据机构及可能的层次结构。 (2)根据需要确定迭代器要实现的功能,如next()、current()等。
组合模式。 使得用户对单个对象和组合对象的使用具有一致性。设计要点:(1)理清部分与整体的关系,了解对象的组成结构。 (2)组合模式是一种具有层次关系的树形结构,不能再分的叶子节点是具体的组件,也就是最小的逻辑单元;具有子节点(由多个子组件组成)的组件称为复合组件,也就是组合对象。
构建模式。 把各种部件通过一定的方式和流程构造一个成品的过程。核心思想:将产品的创建过程与产品本身分离开来,使得创建过程更加清晰,能够更加精确地控制复杂对象的创建过程,让使用者可以用相同的创建过程创建不同的产品。
适配模式。 将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够在一起工作。设计要点:(1)目标:即你期望的目标接口,要转换成的接口。 (2)源对象:即要被转换的角色,要把谁转换为目标角色。(3)适配模式的核心角色,负责把源对象转换和包装成目标对象。
策略模式。定义一系列算法,将每个算法都封装起来,并且使它们之间可以相互替换。策略模式使算法可以独立于使用它的用户而变化。设计要点:(1)上下文环境:起着承上启下的封装作用,屏蔽上层应用对策略(算法)的直接访问,封装可能存在的变化。(2)策略的抽象:策略(算法)的抽象类,定义统一的接口,规定每个子类必须实现的方法。(3)具备的策略:策略的具体实现者,可以有多个不同的(算法或规则)实现。
命令模式。将具体的命令与对应的接收者相关联(捆绑),使得调用方不用关心具体的行动执行者及如何执行,只要发送正确的命令,就能准确无误地完成相应的任务。设计要点:(1)命令:要完成的任务,或要执行的动作,这是命令模式的核心角色。(2)接收者:任务的具体实施方,或行动的真实执行者。(3)调度者:接受任务并发送命令,对接用户的需求并执行内部的命令,负责外部用户与内部命令的交互。(4)用户:命令的使用者,即真正的用户。
备忘模式。可以保存对象的一个状态作为备份,这样便可让对象在将来的某一时刻恢复到之前保存的状态。设计要点:(1)发起人:需要进行备份的对象。(2)备忘录:备份的状态,即一个备份的存档。(3)备忘录管理者:备份存档的管理者,由它附着物与发起人的交互。
享元模式。运用共享技术有效地支持大量细粒度对象的复用。设计要点:(1)享元对象,期望用来共享的对象。享元对象必须是轻量级对象,也就是细粒度对象。(2)享元工厂 该模式的核心角色,负责创建和管理享元对象。
访问模式。封装一些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。设计要点:(1)访问者:负责对数据节点进行访问和操作。(2)数据节点:即要被操作的数据对象。(3)对象结构:数据结构的管理类,也是数据对象的一个容器,可遍历容器内所有的元素。
本文通过《人人都懂设计模式》一书,介绍了设计模式的概念,并以生活中的例子阐述了监听模式、状态模式、中介模式、装饰模式、工厂模式、单例模式、克隆模式、职责链模式、代理模式、外观模式、迭代器模式、组合模式、建造者模式、适配器模式、策略模式、命令模式、备忘录模式和享元模式,帮助读者理解设计模式在实际问题中的应用和设计要点。

512

被折叠的 条评论
为什么被折叠?



