A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李江 中级黑马   /  2013-10-14 09:37  /  1680 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

转自:http://alaric.iteye.com/blog/1915854

门面(Facade)模式(也叫外观模式),为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。如下图表示:

从上图可以看出门面模式是把复杂的业务封装到了子系统内部,而对外部来说只有一个统一的访问界面,使得子系统更加简单,容易被客户端使用。门面模式的体现的是面向对象设计里面的迪米特法则(Law of Demeter)简称LoD,讲的是一个软件实体应当与尽可能少的其他软件实体发生相互作用,通过上面的示意图很明天体现的就是这一点。


门面模式的角色:

门面(Facade)角色:客户端通过此角色能了解到子系统提供的功能,门面角色会委派任务到相应的子系统中去。

子系统(SubSystem)角色:子系统不是单独的类,而是类的集合。负责提供业务逻辑,对子系统来说门面就是它的一个客户端。


在GOF中门面模式没有一个一般化的类图表示,这里用实例说明。门面模式在生活中常见,小时候玩过的游戏机,零花钱都买币玩那个三国志了,一个操作面板相当于一个门面,上面操作杆和操作按钮相当于门面提供的方法,这些方法实现是委托游戏机里面的各个部件,各个部件相互调用,相互配合完成了游戏的控制和操作,把复杂的业务逻辑封装起来,只提供简单有效的操作,这样十几岁的小孩子,乃至8,9岁的孩子都玩的很憨,如果不封装起来,给他电路,显示器,控制元件,估计没人会玩。


还记得我们大学的第一天吗,一个陌生的城市,陌生的环境,入学报到可以说相对复杂和麻烦的事情,但是往往都会有学生会的学长、学姐的接待和帮助,基本上跟着他走,所有事情都由他给你办了,只要签字或交钱就ok了,一切便的很简单。


代码如下:Java代码  

  • package facade;  
  • /**
  • *  
  • *作者:alaric
  • *时间:2013-7-30下午7:53:07
  • *描述:招生办
  • */  
  • public class EnrollmentOffice{  
  •    
  •     /**
  •      * 注册
  •      */  
  •     public void register(){  
  •         System.out.println("注册");  
  •     }  
  • }  

Java代码  

  • package facade;  
  • /**
  • *  
  • *作者:alaric
  • *时间:2013-7-30下午7:54:24
  • *描述:财务办
  • */  
  • public class FinanceSection {  
  •   
  •     /**
  •      * 缴费
  •      */  
  •     public void payment(){  
  •         System.out.println("交学费");  
  •     }  
  • }  

Java代码  

  • package facade;  
  •   
  • /**
  • *  
  • *作者:alaric
  • *时间:2013-7-30下午7:54:44
  • *描述:学生办
  • */  
  • public class StudentAffairsOffice {  
  •   
  •     public void getSomeGoods(){  
  •         System.out.println("领取生活用品");  
  •     }  
  • }  

Java代码  

  • package facade;  
  • /**
  • *  
  • *作者:alaric
  • *时间:2013-7-30下午7:53:46
  • *描述:门面类,就是我们的学长,学姐
  • */  
  • public class Facade {  
  •       
  •     EnrollmentOffice enroll = new EnrollmentOffice();  
  •     FinanceSection finance = new FinanceSection();  
  •     StudentAffairsOffice studentAffairs = new StudentAffairsOffice();  
  •     public void helpJion(){  
  •         enroll.register();  
  •         finance.payment();  
  •         studentAffairs.getSomeGoods();  
  •     }  
  •   
  • }  

Java代码  

  • package facade;  
  • /**
  • *  
  • *作者:alaric
  • *时间:2013-7-30下午7:52:39
  • *描述:客户端
  • */  
  • public class Client {  
  •   
  •     public static void main(String[] args) {  
  •         Facade facade = new Facade();  
  •         facade.helpJion();  
  •     }  
  • }  

运行结果:

注册

交学费

领取生活用品


门面模式的好处在于对于客户端子系统屏蔽了内部组件,减少客户单处理对象的数目,使客户端调用变的简单;将客户端和子系统解耦,子系统内部紧耦合,达到了系统设计的高内聚低耦合的要求。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马