您现在的位置是:首页 >技术教程 >设计模式之二十四种模式大汇总网站首页技术教程

设计模式之二十四种模式大汇总

异样旧日 2024-07-11 00:01:02
简介设计模式之二十四种模式大汇总

类关系

  • 关联关系
    一个类是另一个类的属性成员。

    • 双向关联
    • 单项关联
    • 自关联
    • 多重性关联:1…1、0…*、。。。。
    • 聚合关系:表示整体和部分的关系
    • 组合关系:整体和部分有同一的生命周期
  • 依赖关系
    一个类的方法中使用另一个类作为参数

  • 泛化关系
    父类和子类之间的关系

  • 接口与实现关系
    接口与类之间存在实现关(realization)系
    在这里插入图片描述

  • 示例
    在这里插入图片描述

tip:该部分参考其他博主:http://t.csdn.cn/5Yjg6

创建型模型

  • 简单工厂
    在这里插入图片描述

用一个Factory类中的一个方法,通过传参不同,if else来判断返回不同Product的子类对象

  • 工厂方法
    在这里插入图片描述

通过配置文件返回Factory的具体子类如:FactoryA对象,然后利用多态执行重写方法,返回对应 的Product

  • 抽象工厂模式
    在这里插入图片描述

通过要生产产品品牌生产所对应的工厂HaierFactory,在该工厂中都是生产该品牌的具体对象,然后再调用具体方法productTV()

  • 建造者模式
    在这里插入图片描述

通过一个Director对象,该对象含有Buider成员,并且在该对象方法construct()函数体中使用多态通过Buider类的具体子类 BuiderA的多个方法 buidFood(),buidDrink().. 最终返回一个 Meal对象。----》不同对象的构建,在于对Buider指向的那个子类

  • 原型模式
    在这里插入图片描述

通过具体原型类`DeepClone`或`ShallowClone`来实现原型接口`ProtoClone`,实现克隆方法。`Client`对象中含有`ProtoClone`对象,和其中属性,在`Coyp()`方法中通过调用接口中的方法,返回一个对象,通过`ProtoClone`指向的对象不同实现多态的克隆方法。

  • 单例模式
    在这里插入图片描述

通过私有换构造方法。在Object类中,含有一个静态的Object对象。

饿汉模式:在初始化时就创建该对象,static Object instance = new Object();通过getInstance()接口访问。

懒汉模式:在第一次调用getInstance()接口时,在函数体中会进行判断,如果instancenull则才创建

结构型模式

  • 适配器模式
    在这里插入图片描述

上图为类适配器,适配器Adapter会继承需要使用的Adaptee类,然后再实现Target接口,并在request()实现中使用specificRequest()完成包装,这样用户client对象就可以使用Target对象完成Adaptee对象的功能。

对象适配器:Adapter会继承Target,会定义一个对象属性Adaptee,在request()中使用适配者的方法。

  • 桥接模式
    在这里插入图片描述

在基类Abstraction中含有Implementor对象,通过set()方式给对象赋值为具体的子类对象,在子类RefinedAbstractionoperation()就可以调用属性对象方法operationlmpl()。因此对属性对象的设置来完成方法实现的多态。

  • 组合模式
    在这里插入图片描述

抽象类Component的子类中,包含具体类leaf和一个容器类Composite。容器类通常含有ArrayList list属性对象,可以通过多态向该容器中添加多种leaf类。其中它们都含有共通的方法operation(),不同的实现。

透明组合:Component中声明了所有管理成员对象的方法,包括Leaf不需要的add()

安全组合:在Composite中声明了用于管理的方法,而Component中没有

  • 装饰模式
    在这里插入图片描述

使用Decorator类,其继承于Component,并且包含Compoent属性对象,该对象可以通过set()方法传入不同的ConcreteComponent对象,在 operation()中调用属性对象的方法component.operation()实现原功能 。在其子类如DecoratorA中,会有新增的方法addedBehavior(),并在重写operation()中额外进行调用。

  • 外观模式
    在这里插入图片描述

对象Facacde中含有SubSystemA B C属性对象,通过特点接口如on(),off(),同时控制其子系统。

  • 享元模式
    在这里插入图片描述

通过享元工厂FlyweightFactory对象将不会变化的具体享元对象ConcreteFlyweight进行存在,在使用的时候根据关键字key使用getFlyweight()返回就可以访问。对于外部状态,可以使用接口operation()在使用时由外部自行设置。

  • 代理模式
    在这里插入图片描述

代理对象Proxy中包含RealSubject属性对象,在实现抽象接口request()时,除了调用对象属性的方法,往往还有该代理对象需要额外执行的操作,如:输出时间或运行结果的log、或进行判断权限判断是否可以执行操作。

远程代理:客户通过代理对象的统一接口进行访问操作,而不需要关系代理对象会进行网络服务访问远端服务器等操作。

虚拟代理:当某个对象的资源消耗比较大的时间,可以使用代理对象,等正需要访问这个对象的某些方法时再进行加载和实例化。

行为型模式

  • 职责链模式
    在这里插入图片描述

通过处理者对象Handler属性中设置上级处理者successor。并且在客户执行时往往调用最底层的处理者对象,在该处理者对象的handlerRequest()方法中会根据条件判断需不需要执行successor的处理方法。

  • 命令模式
    在这里插入图片描述

调用者Invoker中含有命令类Command的对象属性,有调用命令执行execute()的方法。具体命令ConcreteCommand对象中含有接收者对象参数,在重写的方法execute()中使用接收者的处理操作完成命令。

  • 解释器模式
    在这里插入图片描述

通过一定的逻辑来调用具体的表达式子类如TerminalExpression对象,用多态调用interpret()完成翻译操作并返回结构,如表达式运算就返回计算后的结果。

  • 迭代器模式

在这里插入图片描述

提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标。

在具体聚合类中ConcreteAggregate中使用内部类声明具体迭代器Concreteleterator,并通过createIterator()返回一个迭代器对象。

  • 中介者模式
    在这里插入图片描述

抽象同事类ConcreteColleague中含有中介者对象属性,具体中介者类COncreteMediator中有容器存储不同具体的Colleague对象。当调用同事A方法sendMessage()给同事B发消息时,函数中会使用中介者属性对象的方法send(),该方法中会通过参数访问到对象B,然后调用B的返回receive()方法使B接收到信息。

  • 备忘录模式
    在这里插入图片描述

通过负责人Caretaker中有备忘录Memento对象属性,其有方法负责对备忘录对象注入set()和获取get()。原发器Originator中有一个方法createMenento()会返回保存state状态的备忘录对象,并且通过restoreMenento()恢复状态。

  • 观察者模式
    在这里插入图片描述

在目标类Subject中有关于观察者Observer对象的属性集合ArrayList,在notify()方法中会遍历观察者对象,并调用其update()方法。

  • 状态模式
    在这里插入图片描述

环境类中含有状态State对象属性,当使用setState()改变对象属性后,其具体操作方法如handle()中所执行的state.handle()操作会不同。

  • 策略模式
    在这里插入图片描述

环境类Context对象中有策略对象Strategy属性,通过传入具体策略对象A B的不同,algorithm()中调用的方法会实现不同的操作。

  • 模板方法模式
    在这里插入图片描述

将完成不同的功能方法Operator1()放进子类中,会用一个模板方法templateMethod()调用相同Operator3()或不同的方法。通过多态实现。

  • 访问者模式
    在这里插入图片描述

访问者对象Vistor中通过方法vist(A)传参调用重载函数,并且不同具体访问者的操作不同。
元素对象中的accept()接口方法会调用visitor.vist()
对象结构ObjectStructure中有ArrayList属性对象存储不同元素,通过accept(v)方法传入不同的具体访问者,并且遍历元素执行element.accapt(v)方法。其中通过传入的观察者子类对象不同以及观察者方法的重载实现多态。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。