1 基础知识
1.1 标准定义
外观(Facade)模式标准定义:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
1.2 分析和说明
外观(Facade)模式也叫外观模式,属于结构型设计模式。外部与一个子系统的通信必须通过一个统一的外观对象进行。外观模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个外观类,而且此外观类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个外观类。
Facade结构如图1所示。其角色包括外观(Facade)角色和子系统(Subsystem)角色。
图1 外观模式结构
外观(Facade)角色:客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。
子系统(Subsystem)角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每一个子系统都可以被客户端直接调用,或者被外观角色调用。子系统并不知道外观的存在,对于子系统而言,外观仅仅是另外一个客户端而已。
2 应用场景举例
比如公司总有前台,来访的人员主要是做这几类工作,一类是过来工作,一类是访客,一类是邮差送东西,还有就是领导视察等。但是都是通过前台来实现。应用场景用例见图2.
图2 外观模式用例图
在这里可以把Facade类理解为外观(Facade)角色。DoWork类,Inspection类,Post类和Visit类是子系统(Subsystem)角色。其结构类图如图3所示。Facade类聚合DoWork类,Inspection类,Post类和Visit类等四个类。
图3 外观模式类图
外观模式实现的顺序图见图4。实现顺序描述:
①创建一个外观facade对象;
②分别创建dowork对象、post对象、visit对象、inspection对象;
③-④调用facade对象的“dowork”工作,dowork对象调用dowork方法;
⑤-⑥调用facade对象的“post”工作,post对象调用dowork方法;
⑦-⑧调用facade对象的“visit”工作,visi对象调用dowork方法;
⑨-⑩调用facade对象的“inspection”工作,inspection对象调用dowork方法。
图4 外观模式实现顺序图
在外观模式的应用中,所有的操作都要经过外观来协调或验证。外观这个高层接口使得各个子系统更容易使用和维护,降低耦合便于扩展。可以解耦关联、增加各部分的独立性.各部分的修改、扩展不影响其他部分,满足组件设计对外提供一致性的要求。
3.Java的实现程序代码
Java程序实现主要包括Facade类文件,DoWork类文件,Inspection类文件,Post类文件和Visit类文件等5个文件。其关系如图3所示。下面分别列出这5个文件的程序代码,最后列出测试代码并显示输出结果。
Facade类程序代码清单01所示。
程序代码清单01
public class Facade { private Visit visit = new Visit(); private Post post = new Post(); private Inspection inspection = new Inspection(); private DoWork doWork = new DoWork(); public void Operate(String operation) { if (operation.toLowerCase().equals("visit")) { visit.operate(); } else if (operation.equals("post")) { post.operate(); } else if (operation.equals("inspection")) { inspection.operate(); } else if (operation.equals("doWork")) { doWork.operate(); } else { System.out.println("没有对应事项,不能工作。"); } } } |
DoWork类,Inspection类,Post类和Visit类程序代码清单02所示。
程序代码清单02
public class DoWork { public void operate() { System.out.println("员工:打卡考勤。"); } } public class Inspection { public void operate() { System.out.println("领导视察:端茶倒水。"); } } public class Post { public void operate() { System.out.println("邮递员:登记收发物品。"); } } public class Visit { public void operate() { System.out.println("访客:登记身份证。"); } } |
外观模式测试程序的代码清单03如下:
程序代码清单03
public class Client { public static void main(String[] args) { Facade facade = new Facade(); // 向前台要求访客 facade.Operate("visit"); // 向前台提交邮品 facade.Operate("post"); // 领导过来视察 facade.Operate("inspection"); // 员工上班 facade.Operate("doWork"); // study是没有对应的工作接口 facade.Operate("study"); } } |
外观模式测试类输出结果如下所示:
访客:登记身份证。 邮递员:登记收发物品。 领导视察:端茶倒水。 员工:打卡考勤。 没有对应事项,不能工作。 |
4 扩展和说明
Session Facade模式是15种J2EE设计模式中的一种设计模式。基于EJB的应用基本上都是通过调用Facade Session Bean来实现的。使用Facade Session Bean,该Session Bean从更大粒度的业务角度来封装复杂的业务流程,为客户端提供一个更简单的访问界面。Session Facade模式结构图。
图5 Session Facade模式结构图
Client可以是一般的Java Object,或者是Business Delegate或其它的SessionBean等。SessionFacade是一个SessionBean,它负责管理多个BusinessObject,为客户端提供更高级别的访问界面。Client通过SessionFacade完成业务逻辑处理。Business Object业务逻辑处理组件。这样的好处在于:①担当业务层的控制器角色。②为客户端提供统一简单的接口界面;③减少耦合性,提高可管理能力;④减少网络调用,提供性能;⑤安全管理,事务管理等的集中控制;⑥暴露更少的接口给客户端。
(转载自微信公众号:架构设计模式)
参考链接
7种结构型模式:
Gof23种设计模式(6)——适配器模式(Adapter)
Gof23种设计模式(7)——桥接模式(Bridge)
Gof23种设计模式(8)——组合模式(Composite)
Gof23种设计模式(9)——装饰器模式(Decorator)
Gof23种设计模式(10)——外观模式(Facade)
Gof23种设计模式(11)——享元模式(Flyweight)
Gof23种设计模式(12)——代理模式(Proxy)
Gof23种设计模式 —— 结构型模式总结和比较
回到总目录:Gof23种设计模式(全解析)
(转载自微信公众号:架构设计模式)