合集-简明设计模式
设计模式脉络
摘要:软件的可扩展性 软件善变,可扩展性成为评价软件生命力的重要指标。 所谓的可扩展性是指软件为了应对将来的业务变化,而提供的扩展能力。当有新的业务发生时,可扩展性较好的软件仅需小范围修改就能提供支持,它们可以保持总体上的稳定。 传统的结构化软件设计方法在这方面力有不及,面向对象方法却有一些天然的优势。 阅读全文
posted @ 2025-04-05 07:08 星辰河岳 阅读(430) 评论(0) 推荐(2)
第一篇 生成及初始化对象 第一章 - 单例模式
摘要:类实例化(instantiate)后会生成对象。 由同一个类经过多次实例化生成的若干对象可以封装不同的数据,产生不同的行为。看个例子。 // 西湖 public class Xihu { private String state; public Xihu(String state) { this.s 阅读全文
posted @ 2025-03-23 01:03 星辰河岳 阅读(72) 评论(0) 推荐(1)
第一篇 生成及初始化对象 第二章 - 工厂方法模式
摘要:抽象类和接口有利于提升软件的扩展能力,然而它们不能用来实例化。 看个例子。 // “采摘”接口 public interface Harvestable { public void harvest(); } // 测试类 public class Test { Harvestable obj = n 阅读全文
posted @ 2025-03-23 10:09 星辰河岳 阅读(43) 评论(0) 推荐(0)
第一篇 生成及初始化对象 第三章 - 抽象工厂模式
摘要:我们继续引用《草虫》中的故事。这里不仅有主人公采摘野菜的场景,还有她对心上人的思念。 // “采摘”接口 public interface Harvestable { public void harvest(); } // “抒情”接口 public interface Expressible { 阅读全文
posted @ 2025-03-23 10:51 星辰河岳 阅读(54) 评论(0) 推荐(0)
第一篇 生成及初始化对象 第四章 - 建造者模式
摘要:刚生成的对象通常还需要经过初始化才能正常工作。对象封装的信息越多,它的初始化过程也越繁琐。 小令《天净沙・秋思》意象丰富,我们以此为例考察对象的初始化过程。 // 秋思 public class QiuSi { private String a, b, c, x, y, z; /* Getters 阅读全文
posted @ 2025-03-23 13:04 星辰河岳 阅读(39) 评论(0) 推荐(0)
第一篇 生成及初始化对象 第五章 - 原型模式
摘要:书接前文,如果我们需要较多的“秋思”对象,需要反复地生成并初始化它们。这些重复性的工作可以简化吗? 继续优化代码。 // 秋思 public class QiuSi implements Cloneable { private String a, b, c, x, y, z; // 建造方法(1) 阅读全文
posted @ 2025-03-23 13:49 星辰河岳 阅读(23) 评论(0) 推荐(0)
第一篇 生成及初始化对象 第六章 - 备忘录模式
摘要:借助建造方法和原型方法提供的便利,可以轻松实现对象信息的备份与恢复。 来看例子。 // 秋思 public class QiuSi implements Cloneable { private String a, b, c, x, y, z; private QiuSi bak;// 备份对象 // 阅读全文
posted @ 2025-03-23 14:03 星辰河岳 阅读(23) 评论(0) 推荐(0)
第一篇 生成及初始化对象 第七章 - 享元模式
摘要:我们曾提到“对象多样性”的概念,这里以“琵琶曲”为例继续讨论这一话题。 琵琶音域宽广,简单起见,假设它有4根弦,每根弦有25个发音点位,共可发出 4×25=100 种音。下面使用“音”类描述琵琶的声音。 // 音 public class Yin { private int xian;// 1~4, 阅读全文
posted @ 2025-03-23 14:49 星辰河岳 阅读(28) 评论(0) 推荐(0)
第二篇 调整对象功能 第八章 - 适配器模式
摘要:我们在上一篇目讨论了对象的生成及初始化,主要关注的是对象从 0 到 1 的创建过程。接下来的三个章节,我们将讨论如何调整已有对象功能,主要关注的是对象从 1 到 n 的转变过程。 设计软件时常将类的职责单一化,使其各司其职。身兼数职的类往往难以阅读,不易维护。然而一旦框定了类的职责,其对象的功能也就 阅读全文
posted @ 2025-03-23 16:09 星辰河岳 阅读(20) 评论(0) 推荐(0)
第二篇 调整对象功能 第九章 - 装饰模式
摘要:我们继续讨论调整对象的方法。 相比于适配器模式转换对象类型的处理方式,装饰模式提供的方法更“温和”一些。装饰模式不改变对象的表观类型,只对对象做一些渐进式的调整。 我们继续引用《木兰诗》中的故事探讨设计思路,这里关注木兰的思亲之情。 看下代码。 // 抒情 public interface Expr 阅读全文
posted @ 2025-03-23 17:29 星辰河岳 阅读(18) 评论(0) 推荐(0)
第二篇 调整对象功能 第十章 - 代理模式
摘要:我们再观察一下上一章《装饰模式》提到的“抽象装饰类”。 // 抽象装饰类 public abstract class EnhancedExpression implements Expressible { private Expressible obj; public EnhancedExpress 阅读全文
posted @ 2025-03-23 20:08 星辰河岳 阅读(27) 评论(0) 推荐(0)
第三篇 遍历对象 第十一章 - 迭代器模式
摘要:接下来的两个章节,我们专门讨论遍历对象的问题。 我们经常将某类型的若干对象放到容器里集中管理,必要时再遍历(逐个访问)它们。 迭代器模式是一种常见的对象遍历方法,它似乎是面向对象编程语言天然应有的特性。 看个例子。 // 测试类 public class Test { // 容器中的对象 Colle 阅读全文
posted @ 2025-03-25 22:06 星辰河岳 阅读(20) 评论(0) 推荐(0)
第三篇 遍历对象 第十二章 - 访问者模式
摘要:迭代器模式主要用于遍历类型相同、集中管理的对象,那些类型各异的散落对象又该如何遍历呢? 我们引用《桃花源记》中的故事,看看访问者模式提供的设计思路。 假设桃花源中有林、山、人三种类型的对象,误入秘境的武陵人需要挨个“访问”它们。 // 林 public class Grove {} // 山 pub 阅读全文
posted @ 2025-03-25 22:21 星辰河岳 阅读(23) 评论(0) 推荐(0)
第四篇 生成对象树 第十三章 - 组合模式
摘要:接下来的两个章节为您介绍树形结构。 树形结构很常见,文件目录和系统菜单是典型的树形结构。自然界中的树形结构更多,这里“树木丛生,百草丰茂。” 我们关注的树形结构主要是“树形对象结构”,也称“对象树”,它描述了对象之间的分支和层次关系。 组合模式常被用来生成对象树。 下面模拟玉米的“茎—苞—须”三级结 阅读全文
posted @ 2025-03-28 19:34 星辰河岳 阅读(23) 评论(0) 推荐(0)
第四篇 生成对象树 第十四章 - 解释器模式
摘要:对象树不仅可以表示对象在结构上的组成关系,还可以表示对象在逻辑上的运算关系。 下面以四则运算代数式的求值过程为例,考察对象树的作用。 给出任意四则运算代数式,比如 a * (b + c) + d (式一) 简便起见,先把它转换成逆波兰表达式(Reverse Polish Notation,RPN)。 阅读全文
posted @ 2025-03-28 21:08 星辰河岳 阅读(20) 评论(0) 推荐(0)
第五篇 驱动方法 第十五章 - 状态模式
摘要:“水光潋滟晴方好,山色空蒙雨亦奇。” 我们曾以西湖美景为例,介绍了若干对象协作完成其类全部功能的程序设计风格,从而引出了“对象多样性”的概念。 其源码如下。 // 西湖 public class Xihu { private String state; public Xihu(String stat 阅读全文
posted @ 2025-03-24 22:51 星辰河岳 阅读(20) 评论(0) 推荐(0)
第五篇 驱动方法 第十六章 - 观察者模式
摘要:如果说状态模式以状态的切换驱动了对象自身的行为变化,那么观察者模式将对象状态改变的消息发送给了其他对象,从而引起它们的联动反应。 我们引用朱自清先生的散文《春》,看看观察者模式的写法。 // 花(被观察者) public class Flower extends java.util.Observab 阅读全文
posted @ 2025-03-25 21:47 星辰河岳 阅读(14) 评论(0) 推荐(0)
第六篇 编排方法 第十七章 - 模板方法模式
摘要:方法是类的重要成员,更是对象功能的载体。接下来的两个篇目,我们将专门讨论方法的编排与驱动。 一般来说,方法(method)描述了对象的行为,抽象方法(abstract method)声明了对象的行动目标。 下面以植物的生长过程为例考察抽象方法的作用。 // 植物 public abstract cl 阅读全文
posted @ 2025-03-23 21:37 星辰河岳 阅读(19) 评论(0) 推荐(0)
第六篇 编排方法 第十八章 - 策略模式
摘要:前文介绍的模板方法由若干抽象方法组合而成,抽象方法之间的关系主要是先后顺序关系。本章我们重点讨论方法之间的另一种关系——平行关系。 同一份功能可以用不同的方法(或算法)实现,这些方法构成了平行关系,彼此可以相互替代,使用时只择取其中一个。 怎么把一组平行的方法组织起来呢? 枚举(enum)是个不错的 阅读全文
posted @ 2025-03-23 22:37 星辰河岳 阅读(19) 评论(0) 推荐(0)
第七篇 调整类间关系 第十九章 - 桥接模式
摘要:接下来的几个章节,我们一起讨论类(class)之间的关系。 类是对象的描述,也是面向对象软件的基本单元,它们之间总是存在着或近或远的关系。从结构上来看,若干类有机结合,才构成了完整的软件;从系统建模的角度来看,某个类可能代表了系统中的某个概念,而使不同概念产生联系,正是系统的魅力所在。 类之间的关系 阅读全文
posted @ 2025-03-28 22:04 星辰河岳 阅读(14) 评论(0) 推荐(0)
第七篇 调整类间关系 第二十章 - 责任链模式
摘要:桥接模式的精髓在于将类之间的关系建立在其抽象层面。沿着这样的设计思路,我们再把职责类似(都会传粉)的“蝴蝶”和“蜜蜂”关联起来。 设想一个蝴蝶和蜜蜂接力为油菜花传粉的情景。 // 传粉媒介 public abstract class Pollinatable { private Pollinatab 阅读全文
posted @ 2025-03-28 22:13 星辰河岳 阅读(25) 评论(0) 推荐(0)
第七篇 调整类间关系 第二十一章 - 命令模式
摘要:如果说责任链模式关注的是“水平方向”的上下游类间关系,那么命令模式关注的是“垂直方向”的上下级类间关系。 这里的上下级类间关系是指某功能(或方法)的请求类与执行类之间的调用关系。 看个例子。 // 设备驱动程序 public class Driver { public static void wor 阅读全文
posted @ 2025-03-28 22:22 星辰河岳 阅读(17) 评论(0) 推荐(0)
第七篇 调整类间关系 第二十二章 - 中介者模式
摘要:前文提到的“请求类”与“执行类”的角色定位是相对的。 若 A 类中有方法调用 B 类,B 类中另有方法调用 A 类,A 类与 B 类就会相互依赖。此时每个类既是对方的请求类,又是对方的执行类。 还有一些更复杂的情况,会使多个类循环依赖。 看个例子。 // A public class A { // 阅读全文
posted @ 2025-03-28 22:36 星辰河岳 阅读(25) 评论(0) 推荐(0)
第七篇 调整类间关系 第二十三章 - 门面模式
摘要:我们再观察一下前文提到的中介者 M。 // M(中介者) public class M { // 采集数据 public static void data() { A.data(); B.data(); C.data(); } } M 隐藏了 A、B、C 等承担具体职责的类,对外提供了一个简单易用的 阅读全文
posted @ 2025-03-28 22:46 星辰河岳 阅读(30) 评论(0) 推荐(0)