1 基础知识
1.1 标准定义
门面模式标准定义:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
1.2 分析和说明
门面模式也叫外观模式,属于结构型设计模式。外部与一个子系统的通信必须通过一个统一的门面对象进行 。门面模式提供一个高层析的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。
Facade结构角色包括门面角色和子系统角色。
门面角色:客户端可以调用这个角色的方法。此角色知晓相关的(一个或多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。
子系统角色:可以同时又一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的聚合 。每一个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。
2 应用场景举例
比如公司总有前台,采访的人员主要是做这几类工作,一类是过来工作,一类是访客,一类是邮差送东西,还有就是领带视察等。但是都是通过前台来实现。
可以把Facade类理解为门面角色,DoWork类,Inspection类,Visit类,Post类是子系统角色。其结构类图如下,Facade类聚合其他四个类。
在门面模式的应用中,所有的操作都要经过门面来协调或验证。门面这个高层接口使得各个子系统更容易使用和维护,降低耦合便于扩展。可以解耦关联、增加各部门的独立性,各部分的修改、扩展不影响其他部分,满足组件设计对外提供一致性的要求。
3 Java实现程序代码
Java程序实现主要包括Facade类文件,DoWork类文件,Inspection类文件,Post类文件和Visit类文件等5个文件。程序代码一次为:
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.toLowerCase().equals("post")){ post.operate(); }else if(operation.toLowerCase().equals("inspection")){ inspection.operate(); }else if(operation.toLowerCase().equals("doWork")){ doWork.operate(); }else System.out.println("没有对应事项,不能工作"); } }
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("访客:登机身份证。"); } }
门面模式测试代码为:
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"); } }
