系列文章
引言
一些软件安装之后,默认的是开机启动,假如一个用户对电脑不太懂,安装一些软件,就会采用软件默认安装的方式,而这些软件默认的是开机启动的,比如:暴风影音,酷狗,qq,杀毒软件,延迟加载的服务等。这些子系统,都在你按下开机键之后,用户不用再去双击这些快捷方式,所有的操作都交给windows系统来做。
如果使用外观模式,如何来实现呢?
外观模式定义
外观模式,提供一个统一的接口去访问多个子系统的多个不同的接口。
外观模式,定义了一个高层次的接口,使得子系统更容易被使用。
类图
参与者
外观类(Facade)
- 知道哪些子系统负责处理哪些请求。
- 将客户的请求传递给相应的子系统对象处理。
子系统类(SubSystem)
- 实现子系统的功能。
- 处理由外观传过来的任务。
- 子系统不用知道外观类。
- 在任何地方也没有应用外观类。
一个例子
1 namespace Wolfy.外观模式 2 { 3 ///4 /// 外观类 5 /// 6 public class Windows 7 { 8 #region 使用组合将使用到的子系统组件,全部都在这里 9 KingSoft kingSoft;10 BaoFeng baoFeng;11 Kugou kugou;12 QQ qq;13 Service services;14 #endregion15 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 }
1 namespace Wolfy.外观模式 2 { 3 ///4 /// 子系统类 5 /// 6 public class KingSoft 7 { 8 public void StartKingSoft() 9 { Console.WriteLine("开启金山毒霸...."); }10 }11 }
1 namespace Wolfy.外观模式 2 { 3 ///4 /// 子系统 5 /// 6 public class BaoFeng 7 { 8 public void StartBaofeng() 9 {10 Console.WriteLine("开启暴风影音....");11 }12 }13 }
1 namespace Wolfy.外观模式 2 { 3 ///4 /// 子系统类 5 /// 6 public class QQ 7 { 8 public void StartQQ() 9 {10 Console.WriteLine("开启qq....");11 }12 }13 }
1 namespace Wolfy.外观模式 2 { 3 ///4 /// 子系统类 5 /// 6 public class Kugou 7 { 8 public void StartKugou() 9 {10 Console.WriteLine("开启酷狗播放器...."); 11 }12 }13 }
1 namespace Wolfy.外观模式 2 { 3 ///4 /// 子系统类 5 /// 6 public class Service 7 { 8 public void StartService() 9 {10 Console.WriteLine("延迟加载服务....");11 }12 }13 }
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模式去访问其他子系统。
缺点
- 限制了客户的自由,减少了可变性。
适用性
- 需要复杂的子系统提供一个简单的接口。
- 客户与抽象的实现类中存在若干依赖。
- 子系统分层是必要的或架构要求的情况下。