设计模式——外观模式

外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。

这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。

 简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。这个模式中,设计到3个角色。

  1).门面角色:外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。

  2).子系统角色:实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。

  3).客户角色:通过调用Facede来完成要实现的功能。

传统方法:

 1 /// <summary>
 2     /// 不使用外观模式的情况
 3     /// 此时客户端与三个子系统都发送了耦合,使得客户端程序依赖与子系统
 4     /// 为了解决这样的问题,我们可以使用外观模式来为所有子系统设计一个统一的接口
 5     /// 客户端只需要调用外观类中的方法就可以了,简化了客户端的操作
 6     /// 从而让客户和子系统之间避免了紧耦合
 7     /// </summary>
 8     class Client
 9     {
10         static void Main(string[] args)
11         {
12             SubSystemA a = new SubSystemA();
13             SubSystemB b = new SubSystemB();
14             SubSystemC c = new SubSystemC();
15             a.MethodA();
16             b.MethodB();
17             c.MethodC();
18             Console.Read();
19         }
20     }
21 
22     // 子系统A
23     public class SubSystemA
24     {
25         public void MethodA()
26         {
27             Console.WriteLine("执行子系统A中的方法A");
28         }
29     }
30 
31     // 子系统B
32     public class SubSystemB
33     {
34         public void MethodB()
35         {
36             Console.WriteLine("执行子系统B中的方法B");
37         }
38     }
39 
40     // 子系统C
41     public class SubSystemC
42     {
43         public void MethodC()
44         {
45             Console.WriteLine("执行子系统C中的方法C");
46         }
47     }

使用外观模式:

 1  /// <summary>
 2     /// 以学生选课系统为例子演示外观模式的使用
 3     /// 学生选课模块包括功能有:
 4     /// 验证选课的人数是否已满
 5     /// 通知用户课程选择成功与否
 6     /// 客户端代码
 7     /// </summary>
 8     class Student
 9     {
10         private static RegistrationFacade facade = new RegistrationFacade();
11 
12         static void Main(string[] args)
13         {
14             if (facade.RegisterCourse("设计模式", "Learning Hard"))
15             {
16                 Console.WriteLine("选课成功");
17             }
18             else
19             {
20                 Console.WriteLine("选课失败");
21             }
22 
23             Console.Read();
24         }
25     }
26 
27     // 外观类
28     public class RegistrationFacade
29     {
30         private RegisterCourse registerCourse;
31         private NotifyStudent notifyStu;
32         public RegistrationFacade()
33         {
34             registerCourse = new RegisterCourse();
35             notifyStu = new NotifyStudent();
36         }
37 
38         public bool RegisterCourse(string courseName, string studentName)
39         {
40             if (!registerCourse.CheckAvailable(courseName))
41             {
42                 return false;
43             }
44 
45             return notifyStu.Notify(studentName);
46         }
47     }
48 
49     #region 子系统
50     // 相当于子系统A
51     public class RegisterCourse
52     {
53         public bool CheckAvailable(string courseName)
54         {
55             Console.WriteLine("正在验证课程 {0}是否人数已满", courseName);
56             return true;
57         }
58     }
59 
60     // 相当于子系统B
61     public class NotifyStudent
62     {
63         public bool Notify(string studentName)
64         {
65             Console.WriteLine("正在向{0}发生通知", studentName);
66             return true;
67         }
68     }
69     #endregion

外观模式的实现核心主要是——由外观类去保存各个子系统的引用,实现由一个统一的外观类去包装多个子系统类,然而客户端只需要引用这个外观类,然后由外观类来调用各个子系统中的方法

外观模式与适配器模式不同的是:适配器模式是将一个对象包装起来以改变其接口,而外观是将一群对象 ”包装“起来以简化其接口。它们的意图是不一样的,适配器是将接口转换为不同接口,而外观模式是提供一个统一的接口来简化接口

外观模式,为子系统的一组接口提供一个统一的接口,该模式定义了一个高层接口,这一个高层接口使的子系统更加容易使用。并且外观模式可以解决层结构分离、降低系统耦合度和为新旧系统交互提供接口功能。

学习于    https://www.cnblogs.com/zhili/p/FacadePattern.html

原文地址:https://www.cnblogs.com/cwmizlp/p/9066028.html