随笔分类 - 设计模式
摘要:目的:使程序高内聚、低耦合、高重用、高灵活,可维护性好,可扩展性高。 设计模式的三种类型: 创建型:单例、工厂、抽象工厂、原型、建造者 结构型:适配器、桥接、装饰、组合、外观、享元、代理 行为型:模板法、命令、访问者、迭代器、观察者、中介者、备忘录、解释器、状态、策略、责任链 七大原则: 一、单一职
阅读全文
摘要:访问者模式的关键在于访问二字,在学习迭代器模式的时候,遍历就是访问的一般形式。 访问者模式的意图在于:将数据结构与作用于结构上的操作进行解耦,使你可以在不改变各元素类的前提下定义作用于这些元素的新操作(方式:增加一个新的具体访问者就好了)。 访问者模式有两个角色,一个是被访问者,一个是访问者,在被访
阅读全文
摘要:责任链模式为请求创建一个接收该 请求对象的 链 , 链条中每个元素都是一个对象 。 责任链模式有两个角色,一个是请求,一个是处理者构成的责任链,当前处理者无法处理请求时,将请求交给下一个责任者。 使用场景如OA 中审批流程 , 需要 组长 , 经理 , 总监 审批请求 ,账号注册时进行校验 , 先后
阅读全文
摘要:状态模式,它允许对象在内部状态发生改变时改变它的行为,简单地讲就是,一个拥有状态的context对象,在不同状态下,其行为会发生改变。 状态模式有两个角色,一个是主类,即上下文类(context),一个是状态类。主类里有状态类对象,把不同的状态下的不同行为,由不同的状态类对象来执行,主类来进行切换状
阅读全文
摘要:解释器模式就像是一种自定义语言,我们可以定义该语言的语法规则,然后从中解析出具体的命令或表达式,最终执行相应的操作。 类似我们使用的编程语言,区别是有的先编译再执行(C#,JAVA),有的是边解释边执行(Javascript、Python)。 解释器分两个角色,一是表达式,二是上下文,表达式又分为终
阅读全文
摘要:备忘录模式,也叫快照模式,它可以在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态,以便在需要的时候恢复到原先保存的状态。 常见的场景比如游戏进度日志,VMWare操作系统快照等,以备后续的恢复。 备忘录模式有三个角色,一是源发器,二是对源发器状态进行记录的备忘录,三是备忘录的管
阅读全文
摘要:仲裁者模式和中介者模式类似,但作用又有不同之处,仲裁者模式是对多个对象的管理协调,而中介者一般是一代一。 仲裁者有两个角色,仲裁者和被仲裁者,使用场景比如winform模式,form就是仲裁者,各种控件就是被仲裁者,仲裁者负责协调管理。 代码示例 package designMode.mediato
阅读全文
摘要:观察者模式通常由两个对象组成:观察者和被观察者。当被观察者状态发生改变时,它会通知所有的观察者对象,使他们能够及时做出响应,所以也被称作“发布-订阅模式”。 示例代码 /** * @author Created by njy on 2023/6/1 * 报纸接口,即被观察者接口 */public i
阅读全文
摘要:迭代器提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 迭代器模式有两个角色,一个是迭代器,一个是聚合器,Java或则c#中的Collection,List,Set,Map就是聚合
阅读全文
摘要:命令模式,请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 命令模式有三个角色,一个命令,二是命令接收者,三是命令调用者。 像http请求,数据库sql命令都是常见的命令模式。 命令模式的意图是将一个请求封装成一个对象,
阅读全文
摘要:模板方法模式是指定义一个操作中算法的骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下即可重定义该算法的某些特定步骤。 模板方法主要有两个角色,一个抽象类模板,定义好骨架,第二是实现的子类,实现抽象类模板的抽象方法,和根据需要重写一些方法,其实这也是我们常用的继承,在这里最好
阅读全文
摘要:策略模式有两个主要角色,一个是主类,一个是策略类,通过主类的构造函数将策略类注入到主类,从而实现调用不同的策略。 典型的例子就是收银策略,正常收费,八折、五折,满200减50等等。 示例代码 package designMode.strategy; public class CashContext
阅读全文
摘要:享元模式,关键在一个享字上。为什么要进行共享,主要有两种原因,一种是有些对象创建时消耗资源比较大,当频次很高时,系统的性能受到显著影响,第二种是创建对象太多,内存占用过大,且这些对象并不是一直都在用。 典型的应用场景是数据库连接池。该模式主要涉及两个角色,一个是享元角色(Flyweight),一个是
阅读全文
摘要:外观模式,就有有一个外观类(Facade),其方法里是对多个子系统(或者其他类的对象)的操作的汇总包装,结果是外部不知道Facade具体做了哪些操作,形成比较好的隔离。 外观模式契合的是迪米特法则原子,即最少知道原则。 主要角色就是一个外观类。 示例代码: package designMode.fa
阅读全文
摘要:组合模式是树形结构的管理,例如组织结构,文件系统等。 组合模式有三个角色,一个是抽象构件,一个是容器构件,一个是叶子构件,容器构件和叶子构件的区别就是容器构件可以添加删除子容器或者叶子,叶子构件没有此功能。 组合模式分为透明组合模式和安全组合模式,其区别是透明模式会把增加或者删除子节点的方法抽象到抽
阅读全文
摘要:适配器模式分为类适配器和对象适配器。 适配器有三个角色,一个是目标(Target),一个是被适配者,一个是适配者。手机充电器就是一个典型的适配器模式,手机需要5V电压,这是目标,被适配者是220v电压,充电器是适配者,将220v电压降为5v电压。 类适配器和对象适配器的区别是,类适配器是适配者继承目
阅读全文
摘要:桥接模式是设计模式中最复杂的模式之一,它把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。 桥接模式有两个角色,一个是主类,一个是被桥接者,主类构造函数里传入被桥接者,这样主类可以调用被桥接者,而被桥接者可以承载各种变化,从而分离开来,各自独立变化。 桥接模式如果是两个维度变化的话
阅读全文
摘要:装饰器模式和代理模式,UML类图上是一样的,结构是一样的,主要区别在于他们的目的不一样,真实使用场景不一样。 例如,抽象被装饰者为 Interface IA,被装饰者A,装饰者是A1,A2,A3,A4,我们代码里可能对A装饰多次,例如 new A1(A),new A2(A1),new A3(A2),
阅读全文
摘要:代理模式,有两个角色,一个是被代理者,一个是代理,代理其实就是生活中的中介,但是代理者可以在原本有的操作上面添加一些自己的操作或动作,就像房产中介,你要买房子,很多事他可以帮你办理,但最终拿的是你的资料进行办理的,中间有可能还有一些小操作,比方说和银行谈贷款利率,他有可能中间也会拿些回扣哦。 这里代
阅读全文
摘要:装饰器,两个角色,一个是待装饰者,一个是装饰者,就像我们早餐吃的煎饼,煎饼是待装饰者,其他的火腿、里脊、土豆丝、生菜等都是装饰者,但最终都没有改变这还是一个煎饼。 这里代码上有两个重要的点,一个是装饰者会也会继承或者实现被装饰者,第二是装饰者的构造函数会有一个类型为待装饰者的参数,代码示例如下: p
阅读全文