前言

最近又学习了一遍设计模式,受益颇深,在编写代码的过程中,设计模式这股神奇的力量是有形的,也是无形的。对于有了一定代码经验的我来说,这里面的绝大部分模式都曾实践过或者遇到过,它们可能描述起来比较抽象,但是到了实际业务中,又发现它就像常识一样,设计得非常自然。作为一个计算机爱好者,尤其是喜欢做软件开发的同学,这个设计模式是必学的本领之一,但是我还是建议同学们等到有一些基本的面向对象编程经验的时候再来看看它,这样能够更好的记忆与理解这些设计模式,并能够领悟到设计模式中的哲学,使之能够更自然地运用到以后的工作中去。

以下是我的一些小结。某些内容还是来自菜鸟教程。

创建型模式

  1. 工厂模式用于生产一类东西(对象),比如生成多种颜色与规格的画笔
  2. 抽象工厂模式用于生成不同类东西的工厂,比如一个抽象工厂不仅产出画笔,而且产出图形。
  3. 单例模式,不说了
  4. 建造者模式,特征:使用多个简单的对象产生一个复杂的对象,比如画布状态。
  5. 原型模式:当创建一个示例的消耗大于浅拷贝一个对象的时候,就会使用原型模式

结构型模式

  1. 适配器模式:用于两端业务不兼容,比如格式转码
  2. 桥接模式:让两种单独继承链条的类实现桥接。比如产品->【P1, P2, P3】,商家->【A,B,C】实现桥接。举个例子,一个代工厂可以生产P1,P2,P3产品,商家ABC,可以作为贴牌,工厂一共可以生产3 *3 = 9 种产品。
  3. 组合模式:整体-部分模式,用于将多种类似的对象集中到一个对象中管理,比如文件管理。
  4. 装饰器模式:类似于继承、或者mixin,比继承灵活的多,但是失去了多态。
  5. 门面模式:形成顶层接口,比如政务服务中心,一个顶层结构可以处理很多模块的东西。
  6. 过滤器模式:很简单,比如筛选可以满足补贴发放的商品。
  7. 享元模式:存在内部数据共享,用于减少内存消耗,内部总是有一个类似于哈希表的东西存在。String.intern()
  8. 代理模式:存在中间类替你操作实际示例。静态代理、动态代理。

行为型模式

  1. 责任链模式:javaweb的filter
  2. 命令模式:类似于go 发送请求里的client.Do(xxx), xxx里包含着要执行的方法与信息。
  3. 解释器模式:对于一些固定文法构建一个解释句子的解释器。就像shell的解释器。
  4. 迭代器模式,java c# c++ php 等里面的迭代器
  5. 中介者模式:类的耦合形成了多对多时,比如聊天时,每一个人都要将自己的信息传输给其他人。使用中介者模式后,所有人只需要将信息传给中介者,中介者会把信息传输给其他人,这样多对多变成了一对多。
  6. 备忘录模式:历史记录模式,比如word中的撤销与重做。对象的每一次操作留有记录。
  7. 观察者模式:类似于中介者模式,一种发布/订阅模式。例如任务分发,分发端发生数据更改的时候,所有client会根据其信息的修改做出自己的动作。
  8. 状态模式:一个类的行为是基于其内部保存的状态而改变的,如果一个类里需要维护的行为非常多,其中动作(方法)总是涉及到大量的判断(if else),此时可以将状态抽出来,作为带有状态的对象,实现动作的接口。
  9. 空对象模式:比直接返回空指针更友好的方式。
  10. 策略模式:一个类的行为或其算法可以在运行时更改,比如完成一项工作,可能会用到不同的策略,使用策略模式可以将最终的执行与实际方法的定义解耦。UML图上这个模式与状态模式是非常接近的。与状态模式的不同点是:状态模式抽出的是“状态本身”,而策略模式抽出的是“解决问题的策略”。
  11. 模板模式:用于构建一个骨架,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
  12. 访问者模式:用户数据的操作与数据本身相隔离。我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。