[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系统来做。

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

外观模式定义

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

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

类图

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

参与者

外观类(Facade)

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

子系统类(SubSystem)

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

一个例子

[Head First设计模式]生活中学设计模式——外观模式
 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
[Head First设计模式]生活中学设计模式——外观模式
 1 namespace Wolfy.外观模式

 2 {

 3     /// <summary>

 4     /// 子系统类

 5     /// </summary>

 6     public class KingSoft

 7     {

 8         public void StartKingSoft()

 9         { Console.WriteLine("开启金山毒霸...."); }

10     }

11 }
KingSoft
[Head First设计模式]生活中学设计模式——外观模式
 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
[Head First设计模式]生活中学设计模式——外观模式
 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
[Head First设计模式]生活中学设计模式——外观模式
 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
[Head First设计模式]生活中学设计模式——外观模式
 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 }

结果:

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

总结

优点

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

缺点

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

适用性

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

你可能感兴趣的:(first)