文章目录
之所以把这几个模式放到一起写,是因为它们的界限比较模糊,结构上没有明显的差别,差别只是语义上。
这几种模式在结构上都类似:
-
代理将原本A-->C的直接调用变成:
A-->B-->C
-
适配器将原本A-->C的直接调用变成:
A-->B-->C
-
桥接将原本A-->C的直接调用变成:
A-->A'-->C
-
门面将原本A-->C、A-->D...的一堆调用变成:
A-->(CD)的调用
-
中介略有区别,将原本 A、B、C的网状模型:
A / \ B -- C
变成星型模型:
A
|
B -- D -- C
门面模式
门面模式(Facade Pattern)是一种结构型设计模式,旨在提供一个统一的接口(界面),以简化一组复杂系统的使用。该模式为客户端提供一个高级接口,隐藏了系统内部子系统的复杂性,使得客户端只需与门面对象交互,而无需了解底层子系统的实现细节。也叫外观模式。
在门面模式中,通常包含以下几个角色:
-
门面(Facade):提供了一个简化的接口,将客户端的请求委派给底层的一个或多个子系统,通过门面对象可以访问底层子系统的功能。
-
子系统(Subsystems):实现了系统的各个功能,但对客户端隐藏了具体的实现细节。客户端可以通过门面对象间接地访问这些子系统。
门面模式的主要优点包括:
-
简化接口:通过门面对象提供简单的接口,隐藏了复杂系统的实现细节,使得客户端更容易使用系统。
-
解耦:将客户端与底层子系统解耦,客户端只需与门面对象交互,而不需要了解底层子系统之间的关系。
-
更好的封装性:通过门面对象封装了底层子系统,使得系统更容易维护和扩展。
门面模式通常适用于以下情况:
- 当系统的许多功能需要以简单的方式提供给客户端时。
- 当需要对一个复杂系统进行简化,并且需要将其功能封装起来,以便提供一个更容易使用的接口时。
- 当需要将系统与其客户端之间解耦,以便系统的变化不会影响到客户端时。
代理模式
在代理模式中,代理对象充当了被访问对象的替身,客户端通过代理对象间接地访问和操作被代理的对象,而不需要直接访问被代理对象。
代理模式通常涉及以下几种角色:
-
抽象主题(Subject):定义了被代理对象和代理对象之间的公共接口,这样在任何使用被代理对象的地方都可以使用代理对象替代。
-
真实主题(Real Subject):是被代理的对象,定义了代理对象所代表的真实对象。
-
代理(Proxy):持有对真实主题的引用,并提供与真实主题相同的接口,以便在任何时候都可以替代真实主题。代理对象通常在访问真实主题之前或之后执行一些额外的操作,如权限验证、缓存、延迟加载等。
中介模式
中介模式(Mediator Pattern)是一种行为型设计模式,它用于降低多个对象之间的耦合度,通过引入一个中介者对象来协调对象之间的交互。在中介模式中,对象之间不直接相互通信,而是通过中介者对象进行通信,从而减少对象之间的直接依赖关系,提高系统的可扩展性。
中介模式通常涉及以下几种角色:
-
中介者(Mediator):定义了一个接口用于与各个同事对象通信,并维护了对各个同事对象的引用。中介者对象可以通过这些引用来了解各个同事对象的状态,并协调它们之间的交互。
-
同事对象(Colleague):是各个相互交互的对象,它们之间不直接通信,而是通过中介者来进行通信。每个同事对象都持有对中介者对象的引用,以便在需要时与中介者进行通信。
中介模式的常见用途包括:
-
解耦对象之间的关系:中介者模式可以降低对象之间的直接依赖关系,将对象之间的交互集中到中介者对象中,从而使得系统更易于维护和扩展。
-
集中控制对象之间的交互:通过引入中介者对象,可以集中控制对象之间的交互逻辑,使得系统更加清晰和可控。
-
减少子系统之间的通信复杂性:当系统中存在大量对象需要进行交互时,中介者模式可以有效地减少对象之间的直接通信,从而降低系统的通信复杂度。
中介模式适用于系统中存在多个对象之间需要进行复杂交互的情况,通过引入中介者对象来简化对象之间的交互过程,从而提高系统的灵活性和可维护性。