[Head First设计模式]生活中学设计模式——外观模式
系列文章
[Head First设计模式]山西面馆中的设计模式——装饰者模式
[Head First设计模式]山西面馆中的设计模式——观察者模式
[Head First设计模式]山西面馆中的设计模式——建造者模式
[Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式
[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 }
1 namespace Wolfy.外观模式 2 { 3 /// <summary> 4 /// 子系统类 5 /// </summary> 6 public class KingSoft 7 { 8 public void StartKingSoft() 9 { Console.WriteLine("开启金山毒霸...."); } 10 } 11 }
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 }
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 }
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 }
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 }
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模式去访问其他子系统。
缺点
- 限制了客户的自由,减少了可变性。
适用性
- 需要复杂的子系统提供一个简单的接口。
- 客户与抽象的实现类中存在若干依赖。
- 子系统分层是必要的或架构要求的情况下。
正文到此结束