设计模式之第7章-外观模式(Java实现)

  “鱼哥,知道怎么把大象装进冰箱里面么?”(作者按:这么简单的问题还想考我,早了几百年吧。)“把大象装进冰箱里,一共需要三步:第一步,把冰箱门打开;第二步,把大象装进去,第三步,把冰箱门关上。”(此处模仿本山老师语调,请自行脑补)“恭喜你,回答正确,那么问题来了,要是有一万个大象是不是要走3万步呢?如果有顺序错了是不是就无法正确的装进去了呢?”为了解决这个问题,我-外观模式也就应运而生了。(作者按:一句话都不让我接、、、)

外观模式之自我介绍

  我呢,是一种比较常见的封装模式,定义是:Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface that makes the subsystem easier to use.翻译过来的意思是:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。外观模式提供了一个高层次的接口,使得子系统更易于使用。

  我比较主要“统一的对象”,也就是提供一个访问子系统的接口,除了这个接口不允许有任何访问子系统的行为发生,通用类图如下所示:

  

  客户程序通过发送请求给Facade的方式与子系统通讯,Facade将这些消息转发给适当的子系统对象,尽管子系统中有关对象在做实际工作,但我也必须将他的接口转换成子系统的接口。

外观模式之自我分析

  我的优点如下:

  • 减少系统的相互依赖。如果不适用我,那么外界将直接访问到系统内部,相互之间是强耦合,你问强耦合怎么了?我告诉你,强耦合就是同生共死,What?你说很浪漫?No,No,No,强依赖在系统设计中式不被接受的。所以你如果看到了,那说明你离重构不远矣~
  • 提高了灵活性。依赖少了,灵活性自然提高,无论系统内部如何变化,只要不影响到外观对象,我自岿然不动。
  • 提高了安全性。想让你访问那些业务就开通哪些逻辑,若不开通,若想访问,窗户都没有。

  有优点自然也会有缺点的:

  • 所谓的缺点就是不符合开闭原则,对扩展开放,对修改关闭。想想我们的实现,在投入使用后若发现门面对象错了,就无法再解决了,唯有修改门面的角色代码,这个风险么,不需要我多说了。

外观模式之实现

  既然说到了大象,那就以大象为题,实现以下罢了~首先是子系统:

  第一步,开冰箱门的子系统: 

 public class A{
public void open(){
System.out.println("把冰箱门打开");
}
}

  第二步,把大象装进去的子系统:

 public class B{
public void pack(){
System.out.println("把大象装进去");
}
}

  第三步,把冰箱门关上的子系统:

 public class C{
public void close(){
System.out.println("把冰箱门关上");
}
}

  由于此三个类是处理的相关业务,也就是说其实是一个子系统的不同的逻辑处理模块,对于此类子系统的访问可以通过下面的外观进行访问,外观对象代码如下:

 public class Facade{
//被委托的对象
private A a = new A();
private B b = new B();
private C c = new C(); //提供外部访问的方法
public void methodA(){
this.a.open();
this.b.pack();
this.c.close();
} }

  至此,外观模式的实现就完成了,以后把大象装进冰箱不用再一步一步的来,直接调用Facade的方法,即可一步到位,麻麻再也不用担心步骤不对了~

外观模式之应用场景

  • 当要为一个复杂的子系统提供一个简单的接口的时候。
  • 当客户程序与抽象类实现部分之间存在很大依赖性的时候。
  • 当需要构建一个层次结构的子系统的时候。

  遇到以上三种情况时,你就可以考虑使用外观模式了。

  以上,预知后式如何,且听下回分解。

  PS:本博客欢迎转发,但请注明博客地址及作者~

   博客地址:http://www.cnblogs.com/voidy/

   博客新址:http://voidy.net

   <。)#)))≦

设计模式之第7章-外观模式(Java实现)的更多相关文章

  1. 设计模式之第22章-组合模式(Java实现)

    设计模式之第22章-组合模式(Java实现) “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊.”“当然”“没有?”“有啊.别急,一会人就到了.” 组合模式之自我介绍 “请问你是?怎 ...

  2. 设计模式之第21章-状态模式(Java实现)

    设计模式之第21章-状态模式(Java实现) “what are you 干啥了?怎么这么萎靡不振?”“昨晚又是补新番,又是补小笼包,睡得有点晚啊.话说杨过的那个雕兄真是太好了,每天给找蛇胆,又陪练武 ...

  3. 设计模式之第20章-访问者模式(Java实现)

    设计模式之第20章-访问者模式(Java实现) “嘿,你脸好红啊.”“精神焕发.”“怎么又黄了?”“怕冷,涂的,涂的,蜡.”“身上还有酒味,露馅了吧,原来是喝酒喝的啊.”“嘿嘿,让,让你发现了,今天来 ...

  4. 设计模式之第17章-备忘录模式(Java实现)

    设计模式之第17章-备忘录模式(Java实现) 好男人就是我,我就是曾小贤.最近陈赫和张子萱事件闹得那是一个沸沸扬扬.想想曾经每年都有爱情公寓陪伴的我现如今过年没有了爱情公寓总是感觉缺少点什么.不知道 ...

  5. 设计模式之第16章-代理模式(Java实现)

    设计模式之第16章-代理模式(Java实现) “现在朋友圈真是太让人蛋疼了啊.”“怎么说?”“一堆代理,各种卖东西的,看着好烦人.”“哎,删了呗.”“都是朋友,哪里好意思删啊.”“这倒也是...哎,迫 ...

  6. 设计模式之第14章-命令模式(Java实现)

    设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...

  7. 设计模式之第11章-建造者模式(Java实现)

    设计模式之第11章-建造者模式(Java实现) “那个餐厅我也是醉了...”“怎么了?”“上菜顺序啊,竟然先上甜品,然后是冷饮,再然后才是菜什么的,无语死了.”“这个顺序也有人这么点的啊.不过很少就是 ...

  8. 设计模式之第10章-桥接模式(Java实现)

    设计模式之第10章-桥接模式(Java实现) “一入软件深似海,从此早睡是路人.黑夜给了我黑色的眼睛,我却用他去寻找八阿哥.”“怎么了,又来那么多的感慨啊.”“还能有什么啊,老板是说让换个APP做,这 ...

  9. 设计模式之第9章-原型模式(Java实现)

    设计模式之第9章-原型模式(Java实现) “快到春节了,终于快放假了,天天上班好累的说.”“确实啊,最近加班比较严重,项目快到交付了啊.”“话说一到过节,就收到铺天盖地的短信轰炸,你说发短信就发吧, ...

随机推荐

  1. Reporting Service服务SharePoint集成模式安装配置(5、安装 SQL SERVER 2012 SP1产品)

    有过SQL2012 数据库安装经验的,可以跳过这一步骤直接进入第五步骤:RS外接程序的安装  数据库安装工具:SQLServer2012 SP1 Name:SQLServer2012SP1-FullS ...

  2. [LeetCode 题解]: plusOne

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given a no ...

  3. 键盘控制背景边框平滑移动(jquery)

    今天同事让我看了一个动画效果,是由键盘控制背景边框平滑移动,我感觉挺cool,所以我自己也动手制作了一个.目的是为了锻炼自己,看自己是否也能在短时间内实现. 先上图: 一.html代码 <!DO ...

  4. NET分页实现及代码

    最近在写一个关于NET的框架,写到后面果不其然的就遇到了分页,自己看了很多关于分页的并自己结合写了一个,晒出来和大家分享一下,第一次写博客望大家多多提意见啦... cs文件分页代码: Paging p ...

  5. 关于.NET C#调用Sqlite的总结一

    --前记 由于自己的密码太多又不容易记住,经常性的会忘记.所以想找个管理软件管理下,可用网上下载的担心不安全.于是自己开始动手写个属于自己的密码管理软件. 因为自己一直做的是WEB开发,对WPF懂的不 ...

  6. CSS:如何清除a标签之间的默认留白间距

    即使我们使用了类似 *{margin: 0;padding: 0;} 这样的代码重置了浏览器默认样式,也会发现类似<a>标签这种inline-block元素,它们之间也还存在着间距. de ...

  7. 理解图像Garbor和HOG特征的提取方法及实例应用

    前言:今天接触到了这两个特征,看了课本和博客后很蒙蔽,没有理解这两个特征,本篇博客的目的是只是参考其他的博客总结这两个特征,如果未来能研究和工作领域是这方面的话再回来自己研学,如有错误也欢迎指出. G ...

  8. Django中的CSRF(跨站请求伪造)

    Django中的CSRF(跨站请求伪造) Django CSRF  什么是CSFR 即跨站请求伪装,就是通常所说的钓鱼网站. 钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别? (页面是怎么来的? ...

  9. 进阶篇:4)面向装配的设计DFA总章

    本章目的:理解装配的重要性,明确结构工程师也要对装配进行设计. 1.基础阅读 ①进阶篇:1)DFMA方法的运用: ②需要一台FDM3d打印机:请查看 基础篇:8)结构设计装备必备: 2.为什么要学习D ...

  10. Sum(欧拉降幂+快速幂)

    Input 2 Output 2 Hint 1. For N = 2, S(1) = S(2) = 1. 2. The input file consists of multiple test cas ...