博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Head First设计模式]生活中学设计模式——外观模式
阅读量:6324 次
发布时间:2019-06-22

本文共 3077 字,大约阅读时间需要 10 分钟。

系列文章

引言

一些软件安装之后,默认的是开机启动,假如一个用户对电脑不太懂,安装一些软件,就会采用软件默认安装的方式,而这些软件默认的是开机启动的,比如:暴风影音,酷狗,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 }
Windows
1 namespace Wolfy.外观模式 2 { 3     ///  4     /// 子系统类 5     ///  6     public class KingSoft 7     { 8         public void StartKingSoft() 9         { Console.WriteLine("开启金山毒霸...."); }10     }11 }
KingSoft
1 namespace Wolfy.外观模式 2 { 3     ///  4     /// 子系统 5     ///  6     public class BaoFeng 7     { 8         public void StartBaofeng() 9         {10             Console.WriteLine("开启暴风影音....");11         }12     }13 }
BaoFeng
1 namespace Wolfy.外观模式 2 { 3     ///  4     /// 子系统类 5     ///  6     public class QQ 7     { 8         public void StartQQ() 9         {10             Console.WriteLine("开启qq....");11         }12     }13 }
QQ
1 namespace Wolfy.外观模式 2 { 3     ///  4     /// 子系统类 5     ///  6     public class Kugou 7     { 8         public void StartKugou() 9         {10             Console.WriteLine("开启酷狗播放器....");        11         }12     }13 }
Kugou
1 namespace Wolfy.外观模式 2 { 3     ///  4     /// 子系统类 5     ///  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模式去访问其他子系统。

缺点

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

适用性

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

转载地址:http://hqdaa.baihongyu.com/

你可能感兴趣的文章
SAP HANA是什么
查看>>
一位游戏制作人的“页游之惑”
查看>>
Ffmpeg和SDL如何同步视频(转)
查看>>
php单例模式
查看>>
js渐变显示渐变消失
查看>>
[置顶] 重装系统的记录
查看>>
深入浅出之Smarty模板引擎工作机制(二)
查看>>
初探领域驱动设计(1)为复杂业务而生
查看>>
ORACLE EXP命令
查看>>
企业招聘要什么人
查看>>
HttpClient_httpclient 4.3.1 post get的工具类
查看>>
267. Palindrome Permutation II
查看>>
Visual Studio Productivity Power Tools居然也开源
查看>>
百度地图坐标转换
查看>>
多线程之ReentrantReadWriteLock
查看>>
CentOS7 vs centos6
查看>>
apache 多站点配置
查看>>
codeforces水题100道 第十三题 Codeforces Round #166 (Div. 2) A. Beautiful Year (brute force)
查看>>
Linux的watch命令 — 实时监测命令的运行结果
查看>>
ASP.NET Core 中文文档 第三章 原理(10)依赖注入
查看>>