设计模式之☞外观模式

简介

  外观模式(Facade Pattern):外部与一个子系统的通讯必须经过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。spa

模式分析

  根据“单一职责原则”,在软件中将一个系统划分为若干个子系统有利于下降整个系统的复杂性,一个常见的设计目标是使子系统间的通讯和相互依赖关系达到最小,而达到该目标的途径之一就是引入一个外观对象,它为子系统的访问提供了一个简单而单一的入口。 -外观模式也是“迪米特法则”的体现,经过引入一个新的外观类能够下降原有系统的复杂度,同时下降客户类与子系统类的耦合度。 - 外观模式要求一个子系统的外部与其内部的通讯经过一个统一的外观对象进行,外观类将客户端与子系统的内部复杂性分隔开,使得客户端只须要与外观对象打交道,而不须要与子系统内部的不少对象打交道。 -外观模式的目的在于下降系统的复杂程度。 -外观模式从很大程度上提升了客户端使用的便捷性,使得客户端无须关心子系统的工做细节,经过外观角色便可调用相关功能。设计

优势

  • 对客户屏蔽子系统组件,减小了客户处理的对象数目并使得子系统使用起来更加容易。经过引入外观模式,客户代码将变得很简单,与之关联的对象也不多。
  • 实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只须要调整外观类便可。
  • 下降了大型软件系统中的编译依赖性,并简化了系统在不一样平台之间的移植过程,由于编译一个子系统通常不须要编译全部其余的子系统。一个子系统的修改对其余子系统没有任何影响,并且子系统内部变化也不会影响到外观对象。
  • 只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。

缺点

  • 不能很好地限制客户使用子系统类,若是对客户访问子系统类作太多的限制则减小了可变性和灵活性。
  • 在不引入抽象外观类的状况下,增长新的子系统可能须要修改外观类或客户端的源代码,违背了“开闭原则”。

用途

  • 当要为一个复杂子系统提供一个简单接口时可使用外观模式。该接口能够知足大多数用户的需求,并且用户也能够越过外观类直接访问子系统。
  • 客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其余子系统解耦,能够提升子系统的独立性和可移植性。
  • 在层次化结构中,可使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而经过外观类创建联系,下降层之间的耦合度。

模式结构图

外观模式包含以下角色:code

  • Facade: 外观角色
  • SubSystem:子系统角色

 时序图

 代码实现

建立接口:

Facade.cs对象

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Facade
 8 {
 9     public interface Facade
10     {
11         void speak();
12     }
13 }

接口实现类:

SystemA.cs、SystemB.cs、SystemC.csblog

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Facade
 8 {
 9     public class SystemA:Facade
10     {
11 
12         public void speak()
13         {
14             Console.WriteLine("我是系统A");
15         }
16     }
17 }
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Facade
 8 {
 9     public class SystemB : Facade
10     {
11         public void speak()
12         {
13             Console.WriteLine("我是系统B");
14         }
15     }
16 }
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Facade
 8 {
 9     public class SystemC : Facade
10     {
11         public void speak()
12         {
13             Console.WriteLine("我是系统C");
14         }
15     }
16 }

建立外观类:

ShapeMaker.cs接口

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Facade
 8 {
 9     public class ShapeMaker
10     {
11         private Facade systemA;
12         private Facade systemB;
13         private Facade systemC;
14         public ShapeMaker()
15         {
16             systemA = new SystemA();
17             systemB = new SystemB();
18             systemC = new SystemC();
19         }
20         public void operationA()
21         {
22             systemA.speak();
23         }
24         public void operationB()
25         {
26             systemB.speak();
27         }
28         public void operationC()
29         {
30             systemC.speak();
31         }
32     }
33 }

控制台实现:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Facade
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             ShapeMaker shapeMaker = new ShapeMaker();
14             shapeMaker.operationA();
15             shapeMaker.operationB();
16             shapeMaker.operationC();
17             Console.ReadKey();
18         }
19     }
20 }

效果:

相关文章
相关标签/搜索