轻松掌握23种常见设计模式(看完直接猛猛做题)持续更新

一.创建者模式

       创建者模式的主要特点是将对象的创建与使用分离,降低系统的耦合度,使用者不需要关注对象的创建细节。

1.SingleLeton(单例)设计模式(常考)

①定义

       这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

②结构&图解

  • 单例类。只能创建一个实例的类

  • 访问类。使用单例类

Singleton:单例,提供一个instance的方法,让客户可以使用它的唯一实例。内部实现只生成一个实例。

2.Factory-工厂方法模式(常考

①定义

       定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象。工厂方法使一个产品类的实例化延迟到其工厂的子类。

②结构

工厂方法模式的主要角色:

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。

  • 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。

  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。

  • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

③图解(咖啡)

使用工厂方法模式对上例进行改进,类图如下:

看完图就懂了:

这里面的咖啡工厂就是抽象工厂

美国咖啡工厂拿铁咖啡工厂就是具体工厂

咖啡抽象产品

美国咖啡拿铁咖啡具体产品

3.Abstract Factory-抽象工厂模式

①定义

是一种为访问类提供一个创建一组相关或相互依赖对象的接口且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。

抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。

②结构

* 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法,可以创建多个不同等级的产品。
* 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
* 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
* 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。

③图解(甜点工厂)

抽象产品:Dessert(甜点)和Coffee(咖啡)

具体产品(甜品):Tiramisu(提拉米苏)和MatchMousse(抹茶慕斯 )

具体产品(咖啡):AmericanCoffee(美国咖啡)和LatteCoffee(拉丁咖啡)

具体工厂:AmericanDessertFactory(美国甜品工厂)和ItayDessertFactory(意大利甜品工厂)

抽象工厂:DessertFactory(甜品工厂)

4.原型模式

①定义:

用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。

②结构
  • 抽象原型类:规定了具体原型对象必须实现的的 clone() 方法。

  • 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。

  • 访问类:使用具体原型类中的 clone() 方法来复制新的对象。

③图解()

5.Builder-建造者模式(生成器模式)

①定义:

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

②结构
  • 抽象建造者类(Builder):这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的部件对象的创建。

  • 具体建造者类(ConcreteBuilder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例。

  • 产品类(Product):要创建的复杂对象。

  • 指挥者类(Director):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

③图解(建造者)

二.结构型模式

       结构性模式涉及如何组合类和对象以获得更大的结构。结构性模式采用继承机制来组合接口或实现。

       结构性对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法。

1.Proxy-代理模式

①定义:

由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介

②结构:
  • 抽象主题(Subject)类: 通过接口或抽象类声明真实主题和代理对象实现的业务方法。

  • 真实主题(Real Subject)类: 实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。

  • 代理(Proxy)类 : 提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

③图解(买火车票):

2.Adapter-适配器模式

①定义:

一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

适配器模式分为类适配器模式和对象适配器模式,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

②结构:
  • 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。

  • 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。

  • 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

③图解(读卡器):

TFCard适配转换成SDCard,适配给电脑使用。

3.Decorator-装饰者模式(常考

①定义

指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。

②结构

* 抽象构件(Component)角色 :定义一个抽象接口以规范准备接收附加责任的对象。
* 具体构件(Concrete  Component)角色 :实现抽象构件,通过装饰角色为其添加一些职责。
* 抽象装饰(Decorator)角色 : 继承或实现抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
* 具体装饰(ConcreteDecorator)角色 :实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

③图解(快餐店)

如图一见了然

FastFood(快餐)是抽象构件。

FriedRice(油炸米饭)和 FriedNoodels(油炸面条)是具体构件。

Garnish(装饰)是抽象装饰。

Egg(鸡蛋)和Bacon(培根)是具体装饰。

4.桥接模式(常考)

①定义

​    将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

例:需要创建不同的图形,并且每个图形都有可能会有不同的颜色

②结构

* 抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用。
* 扩展抽象化(Refined  Abstraction)角色 :是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
* 实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。
* 具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。

③图解(web应用)

假设现在要创建一个Web应用框架,基于此框架能够创建不同的具体Web应用,比如博客、新闻网站和网上商店等;并可以为每个Web应用创建不同的主题样式,如浅色或深色等。

5.Facade-外观模式

定义

​    又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

适用于将一系列对象加以包装以简化其接口。

②结构
  • 外观Facade)角色:为多个子系统对外提供一个共同的接口。

  • 子系统Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。

③图解(只能应用外观)

6.组合模式

①定义:

又名部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

②结构:
  • 抽象根节点Component):定义系统各层次对象的共有方法和属性,可以预先定义一些默认行为和属性。

  • 树枝节点Composite):定义树枝节点的行为,存储子节点,组合树枝节点和叶子节点形成一个树形结构。

  • 叶子节点Leaf):叶子节点对象,其下再无分支,是系统层次遍历的最小单位。

③图解:


7.享元模式

三. 行为型模式

       行为模式涉及算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。这些模式刻画了在运行时难以跟踪的复杂的控制流。它们将用户的注意力从控制流转移到对象间的联系方式上来。

       行为类模式使用继承机制在类间分派行为,主要有Template Method(模板方法)和Interpreter(解释器)两种模式。

       行为对象模式使用对象复合而不是继承。一些行为对象模式描述了一组对等的对象怎样相互协作以完成其中任一个对象都无法单独完成的任务。其他的行为对象模式常将行为封装在一个对象中并将请求指派给它。

1. 模板方法模式

①定义:
②结构

③图解

2. Strategy-策略模式

①定义:

​    该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

②结构:
  • 抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

  • 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为。

  • 环境(Context)类:持有一个策略类的引用,最终给客户端调用。

③图解(销售策略):

Strategy是抽象策略类

StrategyA,StrategyC,StrategyD是具体策略类

3. Command-命令模式(常考

①定义:

        将一个请求封装为一个对象,使发出请求的责任执行请求的责任 分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。

 ②结构:

  • 抽象命令类(Command)角色: 定义命令的接口,声明执行的方法。

  • 具体命令(Concrete Command)角色:具体的命令,实现命令接口;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。

  • 实现者/接收者(Receiver)角色: 接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。

  • 调用者/请求者(Invoker)角色: 要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。

③图解(服务员点餐):

将上面的案例用代码实现,那我们就需要分析命令模式的角色在该案例中由谁来充当。

服务员(Waiter): 就是调用者角色,由她来发起命令。

资深大厨(SeniorChef): 就是接收者角色,真正命令执行的对象。

订单(Order): 命令中包含订单。

命令(Command):抽象命令类

订单命令(OrderCommand):具体命令

4. 职责链模式

①定义:
②结构

③图解

5. State-状态模式

①定义:

对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。

②结构:
  • 环境(Context)角色:也称为上下文,它定义了客户程序需要的接口,维护一个当前状态,并将与状态相关的操作委托给当前状态对象来处理。

  • 抽象状态(State)角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为。

  • 具体状态(Concrete State)角色:实现抽象状态所对应的行为。

③图解(自动售货机):

6. Observer-观察者模式(常考)

①定义:

       又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。

观察者模式的最主要特征是使所要交互的对象尽量松耦合。

欲使一个后端数据模型能够被多个前端用户界面连接,采用观察者模式最适合。

②结构
  • Subject抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。

  • ConcreteSubject具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。

  • Observer:抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。

  • ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。

③图解(微信公众号)

微信用户就是具体观察者

微信公众号具体被观察者

7. Mediator-中介者模式(常考

①定义:

又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。

②结构:
  • 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。

  • 具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。

  • 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。

  • 具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

③图解:

8. Iterator-迭代器模式

①定义:

提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。

②结构:
  • 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。

  • 具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。

  • 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、next() 等方法。

  • 具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。

③图解:

9. Visitor-访问者模式(常考

①定义:

封装一些作用于某种数据结构中的各元素的操作它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作

②结构
  • 抽象访问者Visitor)角色:定义了对每一个元素(Element)访问的行为,它的参数就是可以访问的元素,它的方法个数理论上来讲与元素类个数(Element的实现类个数)是一样的,从这点不难看出,访问者模式要求元素类的个数不能改变。

  • 具体访问者ConcreteVisitor)角色:给出对每一个元素类访问时所产生的具体行为。

  • 抽象元素Element)角色:定义了一个接受访问者的方法(accept),其意义是指,每一个元素都要可以被访问者访问。

  • 具体元素ConcreteElement)角色: 提供接受访问方法的具体实现,而这个具体的实现,通常情况下是使用访问者提供的访问该元素类的方法。

  • 对象结构Object Structure)角色:定义当中所提到的对象结构,对象结构是一个抽象表述,具体点可以理解为一个具有容器性质或者复合对象特性的类,它会含有一组元素(Element),并且可以迭代这些元素,供访问者访问。

③图解(动物之家):

抽象元素(Animal)下面是两个具体元素(Dog和Cat)

对象结构(Home)

抽象访问者(Person)下面是两个具体访问者(Owner和Someone)

10. 备忘录模式

11. 解释器模式

  • 39
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gabriel Drop Out

饿饿!饭饭!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值