设计模式梳理

设计模式梳理
最新回答
幽萌之羽

2023-03-31 05:29:42

设计模式梳理

设计模式是软件开发中用于解决常见问题的最佳实践。它们提供了一种可复用的设计思路,使得代码更加模块化、易于维护和扩展。以下是设计模式的梳理,包括六大原则和各种具体的设计模式。

设计模式的六大原则
  1. 开闭原则(Open Close Principle)

    定义:对扩展开放,对修改关闭。

    解释:在程序需要进行拓展的时候,不能去修改原有的代码,而是通过添加新的代码来实现扩展。这有助于保持软件的稳定性和可维护性。

  2. 里氏代换原则(Liskov Substitution Principle)

    定义:任何基类可以出现的地方,子类一定可以出现。

    解释:子类应该能够替换基类而不会导致程序出错。这确保了基类的复用性和子类的可扩展性。

  3. 依赖倒转原则(Dependence Inversion Principle)

    定义:针对接口编程,依赖于抽象而不依赖于具体。

    解释:高层模块不应该依赖于低层模块,二者都应该依赖于抽象。这有助于降低模块之间的耦合度,提高系统的灵活性。

  4. 接口隔离原则(Interface Segregation Principle)

    定义:使用多个隔离的接口,比使用单个接口要好。

    解释:一个类不应该依赖于它不需要的接口。通过将接口拆分成更小的、更具体的接口,可以提高系统的可维护性和可扩展性。

  5. 迪米特法则,又称最少知道原则(Demeter Principle)

    定义:一个实体应当尽量少地与其他实体之间发生相互作用。

    解释:这有助于减少模块之间的通信,降低系统的复杂性。每个模块只应该与它直接相关的模块进行交互。

  6. 合成复用原则(Composite Reuse Principle)

    定义:尽量使用合成/聚合的方式,而不是使用继承。

    解释:通过组合多个简单对象来创建复杂对象,而不是通过继承来实现。这有助于保持类的单一职责,提高代码的可读性和可维护性。

具体设计模式创建型模式
  1. 工厂模式

    描述:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类。

    角色:创建者(提供具体参数格式)、维护者(针对具体信息派生对象)、调用者(提供具体信息,返回对应对象,不需要new)。

  2. 抽象工厂模式

    描述:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

    角色:创建者(向工厂模式添加大的分类标识)、维护者(添加分类标识对应的工厂,针对工厂进行维护)、调用者(额外提供分类标识获取对应工厂)。

  3. 单例模式

    描述:确保一个类仅有一个实例,并提供一个全局访问点。

    角色:创建者(提供返回唯一对象方法)。

  4. 建造者模式

    描述:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    角色:创建者(创建资源与资源依赖,提供打包方式)、维护者(创建新的打包选项,并根据选项打包资源,针对新出现的资源类型进行添加)、调用者(选择打包选项)。

  5. 原型模式

    描述:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

    角色:创建者(提供对象并通过浅拷贝接口返回克隆对象)、调用者(可以通过不同的对象对同一资源进行管理)。

结构型模式
  1. 适配器模式

    描述:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。

    角色:创建者(建立相同调用格式,针对已有的不同功能模块完成相同格式的封装)、维护者(添加相同格式的功能扩展)、调用者(调用相同的格式使用不同模块的功能)。

  2. 桥接模式

    描述:将抽象部分与它的实现部分分离,使它们都可以独立地变化。

    角色:创建者(建立带插槽的同一调用方式工具类)、维护者(针对插槽的调用方式提供所需插件)、调用者(选择所需插件插入工具类插槽完成调用)。

  3. 过滤器模式

    描述:通过定义一组规则来对数据流进行过滤,从而得到符合特定条件的数据。

    角色:创建者(建立需过滤结构类,针对过滤条件创建条件组合规则)、维护者(增加新的过滤条件实现)、调用者(提供需过滤类对象集合与过滤条件,返回需要的目标对象集合)。

  4. 组合模式

    描述:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

    角色:创建者(建立节点类,节点类包含树形嵌套关系和同一套调用接口)、维护者(创建新的节点对象,并通过嵌套关系维护树形结构)、调用者(对树中节点用同一套接口进行访问)。

  5. 装饰器模式

    描述:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

    角色:创建者(建立调用规则,并提供基础调用类)、维护者(添加用基础对象返回精细对象的模块,并且精细调用对象也符合基础对象调用规则)、调用者(创建基础对象,并利用基础对象依次调用对应的模块返回精细对象,调用对应接口完成精细的功能)。

  6. 外观模式

    描述:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

    角色:创建者(创建外观调用,并将子系统的功能结合到外观中,保证其无需了解子系统即可调用)、维护者(添加子系统,将其功能以简单调用的方式添加到外观中)、调用者(调用外观)。

  7. 享元模式

    描述:运用共享技术有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来减少对象的创建开销和内存消耗。

    角色:创建者(建立享元map,构造单例工厂与元map连接,确保同key值返回同一元对象)、维护者(扩充map)、调用者(调用工厂返回单例元)。

  8. 代理模式

    描述:为其他对象提供一种代理以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介的作用。

    角色:创建者(构造与被代理者相同的调用方式的代理结构,并进行剪裁与优化)、维护者(对新调用方式进行剪裁与优化)、调用者(无感知调用代理结构完成功能)。

行为型模式
  1. 责任链模式

    描述:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

    角色:创建者(构造匹配规则与通用调用,添加到通用调用链式结构,链式结构访问接口)、维护者(扩充匹配规则及其相应的通用调用)、调用者(调用访问接口)。

  2. 命令模式

    描述:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化、对请求排队或记录请求日志,以及支持可撤销的操作。

    角色:创建者(构建命令执行者,命令通用接口,针对具体命令执行执行者的对象,命令队列通用调用支持)、维护者(扩充命令执行者,添加对应的命令的执行执行者对象,添加到队列调用)、调用者(向调用传递命令队列完成功能)。

  3. 解释器模式

    描述:给定一个语言,定义它的文法表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。

    角色:创建者(建立基本解释规则,构建通用解释接口,根据通用添加单一功能解释单元(其中包含组合,结束等拼接语法单元))、维护者(扩充单一功能解释单元)、调用者(组合解释单元验证上下文完成功能)。

  4. 迭代器模式

    描述:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。

    角色:创建者(为容器添加特定遍历规则的遍历器工厂方法)、维护者(增加特定规则的遍历器,为容器添加工厂方法)、调用者(调用特定工厂方法返回遍历器遍历)。

  5. 中介者模式

    描述:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

    角色:创建者(创建中介者及其活动规则(参与者与场景或其他参与者的交互),支持参与者的个体行为)、维护者(完善活动规则,并对参与者的个体行为进行支持)、调用者(创建参与者参与活动,无需关注其他参与者具体信息)。

  6. 备忘录模式

    描述