转载

[Head First设计模式]生活中学设计模式——外观模式

系列文章

[Head First设计模式]山西面馆中的设计模式——装饰者模式

[Head First设计模式]山西面馆中的设计模式——观察者模式

[Head First设计模式]山西面馆中的设计模式——建造者模式

[Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式

[Head First设计模式]一个人的平安夜——单例模式

[Head First设计模式]抢票中的设计模式——代理模式

[Head First设计模式]面向对象的3特征5原则

[Head First设计模式]鸭子模型——策略模式

[Head First设计模式]云南米线馆中的设计模式——模版方法模式

[Head First设计模式]餐馆中的设计模式——命令模式

[Head First设计模式]身边的设计模式——适配器模式

[Head First设计模式]生活中学设计模式——迭代器模式

[Head First设计模式]生活中学设计模式——组合模式

引言

一些软件安装之后,默认的是开机启动,假如一个用户对电脑不太懂,安装一些软件,就会采用软件默认安装的方式,而这些软件默认的是开机启动的,比如:暴风影音,酷狗,qq,杀毒软件,延迟加载的服务等。这些子系统,都在你按下开机键之后,用户不用再去双击这些快捷方式,所有的操作都交给windows系统来做。

如果使用外观模式,如何来实现呢?

外观模式定义

外观模式,提供一个统一的接口去访问多个子系统的多个不同的接口。

外观模式,定义了一个高层次的接口,使得子系统更容易被使用。

类图

参与者

外观类(Facade)

  • 知道哪些子系统负责处理哪些请求。
  • 将客户的请求传递给相应的子系统对象处理。

子系统类(SubSystem)

  • 实现子系统的功能。
  • 处理由外观传过来的任务。
  • 子系统不用知道外观类。
  • 在任何地方也没有应用外观类。

一个例子

 1 namespace Wolfy.外观模式
 2 {
 3     /// <summary>
 4     /// 外观类
 5     /// </summary>
 6     public class Windows
 7     {
 8         #region 使用组合将使用到的子系统组件,全部都在这里
 9         KingSoft kingSoft;
10         BaoFeng baoFeng;
11         Kugou kugou;
12         QQ qq;
13         Service services;
14         #endregion
15 
16         public Windows(KingSoft kingSoft, BaoFeng baoFeng, Kugou kugou, QQ qq, Service services)
17         {
18             //外观将子系统中每一个组件的引用都传入它的构造函数中,然后外观把它们赋值给相应的实例变量
19             this.kingSoft = kingSoft;
20             this.baoFeng = baoFeng;
21             this.kugou = kugou;
22             this.qq = qq;
23             this.services = services;
24         }
25         public void StartWindows()
26         {
27             kingSoft.StartKingSoft();
28             baoFeng.StartBaofeng();
29             kugou.StartKugou();
30             qq.StartQQ();
31             services.StartService();
32         }
33     }
34 }
Windows
 1 namespace Wolfy.外观模式
 2 {
 3     /// <summary>
 4     /// 子系统类
 5     /// </summary>
 6     public class KingSoft
 7     {
 8         public void StartKingSoft()
 9         { Console.WriteLine("开启金山毒霸...."); }
10     }
11 }
KingSoft
 1 namespace Wolfy.外观模式
 2 {
 3     /// <summary>
 4     /// 子系统
 5     /// </summary>
 6     public class BaoFeng
 7     {
 8         public void StartBaofeng()
 9         {
10             Console.WriteLine("开启暴风影音....");
11         }
12     }
13 }
BaoFeng
 1 namespace Wolfy.外观模式
 2 {
 3     /// <summary>
 4     /// 子系统类
 5     /// </summary>
 6     public class QQ
 7     {
 8         public void StartQQ()
 9         {
10             Console.WriteLine("开启qq....");
11         }
12     }
13 }
QQ
 1 namespace Wolfy.外观模式
 2 {
 3     /// <summary>
 4     /// 子系统类
 5     /// </summary>
 6     public class Kugou
 7     {
 8         public void StartKugou()
 9         {
10             Console.WriteLine("开启酷狗播放器....");        
11         }
12     }
13 }
Kugou
 1 namespace Wolfy.外观模式
 2 {
 3     /// <summary>
 4     /// 子系统类
 5     /// </summary>
 6     public class Service
 7     {
 8         public void StartService()
 9         {
10             Console.WriteLine("延迟加载服务....");
11         }
12     }
13 }
Service
 1 namespace Wolfy.外观模式
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             KingSoft kingSoft=new KingSoft();
 8             BaoFeng baoFeng=new BaoFeng();
 9             Kugou kugou=new Kugou();
10             QQ qq=new QQ();
11             Service services=new Service();
12             Windows windows = new Windows(kingSoft, baoFeng, kugou, qq, services);
13             windows.StartWindows();
14             Console.Read();
15         }
16     }
17 }

结果:

总结

优点

  • 提供了一个简单且公用的接口去处理复杂的子系统,并且没有子系统的功能。
  • 遮蔽了子系统的复杂性,避免了客户与子系统直接连接,也减少了子系统与子系统间的连接,每个子系统都有它的Facade模式,子系统Facade模式去访问其他子系统。

缺点

  • 限制了客户的自由,减少了可变性。

适用性

  • 需要复杂的子系统提供一个简单的接口。
  • 客户与抽象的实现类中存在若干依赖。
  • 子系统分层是必要的或架构要求的情况下。
正文到此结束
本文目录