您的位置:首页 > 编程语言 > Java开发

Java设计模式--门面模式【Facade Pattern】

2017-08-28 11:02 459 查看
         门面模式又为外观模式,属于对象结构型模式。门面模式的定义是:外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 
 


  简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。这个模式中,涉及到3个角色:

  客户角色:通过调用Facede来完成要实现的功能。

  门面角色:外观模式的核心,它被客户角色调用,封装了子系统对象的引用,对外提供统一的接口。

  子系统角色:实现了子系统的功能,它对客户角色是未知的,它内部可以有系统内的相互交互,也可以由供外界调用的接口。子系统并不知道门面的存在。对于子系统而言,门面仅仅是另外一个客户端而已。

  门面模式是一个很好的封装方法,一个子系统比较复杂时,比如算法或者业务比较复杂,就可以封装出一个或多个门面出来,项目的结构简单,而且扩展性非常好。

  下面就以实例借以说明。最近在看电视剧《大军师司马懿之军师联盟》,剧情跌宕起伏,精彩绝伦。正好在看到荀彧自杀后,搜出一封诋毁君王的信,模仿曹丕字迹所写。曹丕连连喊冤,慷慨言辞,至诚至信。几经周折,最后曹操下令让大理寺钟繇审理此案,务必追查到底。这里的”大理寺“就相当于一个门面,对外,君王和大臣无需关心案情如何调查审理,只关心审理后的结果。对内,大理寺本身只需要委派钟繇负责此案即可。相关代码如下:    

package com.pattern.facade;
/**
* 实际子系统的接口
* 定义子系统的各行为
* @author
*/
public interface CheckCase {
public void checkWriting_CaoPi();//调查曹丕的字迹
public void checkAllWriting();//调出所有上表竹简,将书信的字迹与所有竹简的字迹对比
public void findImitator();//找到可疑人
public void surveyImitator();//调查可疑人
public void report();//对外报告
}
  具体子系统的实施者,相当于钟繇:

package com.pattern.facade;
/**
* 具体审查案子的人员
* 实际实施审查案子的职责
* @author
*
*/
public class Checker implements CheckCase {
@Override
public void checkWriting_CaoPi() {
System.out.println("曹丕字迹的特点是落笔飞扬,气宇不凡...");
}
@Override
public void checkAllWriting() {
System.out.println("一个一个地看上表竹简,看谁的字迹比较像书信的字迹...");

}
@Override
public void findImitator() {
System.out.println("字迹神似,发现可疑人物崔琰...");
}

@Override
public void surveyImitator() {
System.out.println("找来崔琰问话,结果全招了...");
}

@Override
public void report() {
System.out.println("向外公布调查结果...");
}

}
 大理寺担任门面角色,被曹操一声令下负责对外提供调查结果:

package com.pattern.facade;
/**
* 大理寺--一个负责案子的审查机关
* 大王和大臣们无需关心大理寺如何查案,只关心审查的结果和相关书面报告
* @author
*
*/
public class DaliTemple {
private Checker checker=new Checker();

public void checkCase(){//审查案子:调用了实际办案人的行为操作
checker.checkWriting_CaoPi();
checker.checkAllWriting();
checker.findImitator();
checker.surveyImitator();
checker.report();
}
}
  国王担任客户端的角色,他要查案子,让大理寺负责:

package com.pattern.facade;
/**
* 大王曹操找来大理寺的钟繇,这个案子就交与你们大理寺审理
* 钟繇惴惴不安地点头称是,心里嘀咕,这个案子可不好办呀,两虎相争,必有一伤,曹植、曹丕我能得罪得起谁呀?
* @author
*
*/
public class King {
public static void main(String[] args) {
DaliTemple temple=new DaliTemple();
temple.checkCase();
}
}
测试结果:



门面模式的优点与缺点

 优点:
  1、减少系统的相互依赖:如果不使用门面模式,外界访问直接深入到子系统内部,相互之间是一种强耦合关系,这样的强依赖是系统设计所不能接受的,门面模式的出现就很好地解决了该问题,所有的依赖都是对门面对象的依赖,与子系统无关。
  2、 提高了灵活性:依赖减少了,灵活性自然提高了。不管子系统内部如何变化,只要不影响到门面对象,任你自由活动。
  3、 提高安全性:只能通过门面访问有限的子系统资源,其他资源不能直接访问。

 缺点:

  不符合开闭原则,对修改关闭,对扩展开放,看看我们那个门对象吧,它可是重中之重,一旦在系统投产后发现有一个小错误,你怎么解决?完全遵从开闭原则,根本没办法解决,只能修改门面角色的代码,这个风险相当大。 

源码下载:http://download.csdn.net/download/pelifymeng2/9994734   <
4000
/span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息