设计模式之美:Facade(外观)

简介:

索引

意图

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

Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.

结构

参与者

Facade

  • 知道哪些子系统类负责处理请求。
  • 将客户的请求代理给适当的子系统对象。

Subsystem Classes

  • 实现子系统的功能。
  • 处理由 Facade 对象指派的任务。
  • 没有 Facade 的任何相关信息。

适用性

在以下情况下可以使用 Facade 模式:

  • 当你要为一个复杂子系统提供一个简单接口时。
  • 客户程序与抽象类的实现部分之间存在着很大的依赖性。
  • 当你需要构建一个层次结构的子系统时,使用 Facade 模式定义子系统中每层的入口点。

效果

  • 它对客户屏蔽子系统组件,使用 Facade 的客户程序不需要直接访问子系统对象。
  • 它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。
  • 如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性和通用性之间加以选择。

相关模式

  • Abstract Factory 模式可以与 Facade 模式一起使用以提供一个接口,这一接口可用来以一种子系统独立的方式创建子系统对象。
  • Mediator 模式与 Facade 模式的相似之处是,它抽象了一些已有的类的功能。Mediator 的目的是对同事之间的任意通讯进行抽象,通常集中不属于任何单个对象的功能。Facade 模式仅对子系统接口进行抽象,并不定义新功能。
  • 通常来讲,可能仅需要一个 Facade 对象,因此可以用 Singleton 模式定义 Facade。

实现

实现方式(一):用抽象类定义 Facade 而使子类对应于不同的子系统。

将一个系统划分成若干个子系统有利于降低系统的复杂性。一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小。

大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。

Facade 可以提供一个简单的缺省视图,这一视图对于大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过 Facade 层。

用抽象类实现 Facade 而它的具体子类对应于不同的子系统实现,这可以进一步降低客户与子系统的耦合度。

复制代码
 1 namespace FacadePattern.Implementation1
 2 {
 3   public abstract class Facade
 4   {
 5     public abstract void Operation();
 6   }
 7 
 8   public class ConcreteFacade : Facade
 9   {
10     public override void Operation()
11     {
12       // we could use any factory here
13       // or use IoC here
14       SubsystemClassA subsystemClassA = new SubsystemClassA();
15       SubsystemClassB subsystemClassB = new SubsystemClassB();
16 
17       subsystemClassA.BehaviorA();
18       subsystemClassB.BehaviorB();
19     }
20   }
21 
22   public class SubsystemClassA
23   {
24     public void BehaviorA()
25     {
26       // do something
27     }
28   }
29 
30   public class SubsystemClassB
31   {
32     public void BehaviorB()
33     {
34       // do something
35     }
36   }
37 
38   public class Client
39   {
40     public void TestCase1()
41     {
42       Facade facade = new ConcreteFacade();
43       facade.Operation();
44     }
45   }
46 }
复制代码
目录
相关文章
|
设计模式 算法
设计模式7 - 门面模式【Facade Pattern】
设计模式7 - 门面模式【Facade Pattern】
63 1
|
7月前
|
设计模式 Java 应用服务中间件
设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用
设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用
65 1
|
7月前
|
设计模式
设计模式之-门面 Facade
设计模式之-门面 Facade
66 2
|
设计模式 Java 数据库连接
【设计模式——学习笔记】23种设计模式——外观模式Facade(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——外观模式Facade(原理讲解+应用场景介绍+案例介绍+Java代码实现)
115 0
|
7月前
|
设计模式
设计模式 | 门面模式 Facade
设计模式 | 门面模式 Facade
55 0
|
7月前
|
设计模式
二十三种设计模式全面解析-外观模式(Facade Pattern)详解:简化复杂系统的奇妙之道
二十三种设计模式全面解析-外观模式(Facade Pattern)详解:简化复杂系统的奇妙之道
126 0
|
7月前
|
设计模式 Java 数据库连接
认真学习设计模式之外观模式(Facade Pattern)
认真学习设计模式之外观模式(Facade Pattern)
73 0
|
设计模式 应用服务中间件 uml
解锁设计模式的神秘面纱:编写无懈可击的代码之外观设计模式
解锁设计模式的神秘面纱:编写无懈可击的代码之外观设计模式
55 1
|
设计模式 Java
设计模式~门面(外观)模式(Facade)-08
目录 (1)优点 (2)缺点 (3)使用场景 (4)注意事项: (5)应用实例: (6)源码中的经典应用 代码 外观模式(Fac
62 0
|
设计模式 缓存 领域建模
23种设计模式漫画版系列—外观设计模式
23种设计模式漫画版系列—外观设计模式
172 0

热门文章

最新文章