Java设计模式之外观模式

外观模式(facade pattern): 提供了一个统一的接口, 用来访问子系统中的一群接口. 外观定义了一个高层接口, 让子系统更容易使用。

外观模式的详解

先举个例子,我们那银行卡到ATM机前取款,首先插卡输密码、而后查询余额、接着进行取款、最后完成取卡。每一步都是有顺序的,假设把每一个步骤都想象成一个子系统内的一个对象,那么在程序中用户需要在子系统里的每一个对象都要去实例化,然后进行相应的操作。而且还不能乱了顺序。

这里写图片描述

解决这种问题就需要用外观模式比较合适了,我用一个外观类,里面已经把操作的各步骤都给安排好,这样用户就可以安心的操作,不用担心有没有实例化、或者操作顺序。

这里写图片描述

类图:(其实外观模式没有一般化的类图描述,用形象一点的就是以下显示)
这里写图片描述

角色说明:
外观角色(Facade):客户端可以调用这个角色的方法,外观角色了解相关的所有子系统的功能和责任。正常情况下,外观角色将所有从客户端发来的请求为派给相应的子系统去。

子系统角色(SubSystem):可以同时有一个或者多个子系统,每个子系统都不是一个单独的类,而是一个类的集合(上图的子系统就包含Operation1、2、3和4)。每个子系统都可以被客户端直接调用,或者被外观角色调用,子系统并不知道外观角色的存在,对于子系统而言,外观角色就是另一个客户端。

代码演示,子系统中的角色,操作类1:

public class Operation1 {  
    // 示意方法  
    public void test1() {  
        System.out.println("操作一:插卡输密码!");  
    }  
}  

操作类2:

public class Operation2 {
    // 示意方法
    public void test2() {
        System.out.println("操作二:查询余额!");
    }
}

操作类3:

public class Operation3 {
    // 示意方法
    public void test3() {
        System.out.println("操作三:输入数字取钱!");
    }
}

操作类4:

public class Operation4 {
    // 示意方法
    public void test4() {
        System.out.println("操作四:操作完成,取卡!");
    }
}

外观角色类:

public class Facade {
    // 示意方法,满足客户端需要的功能
    public void test() {
        Operation1 one = new Operation1();
        one.test1();
        Operation2 two = new Operation2();
        two.test2();
        Operation3 three = new Operation3();
        three.test3();
        Operation4 four = new Operation4();
        four.test4();
    }
}

客户端测试类:

public class Test {  

    public static void main(String[] args) {  

        Facade facade = new Facade();  
        facade.test();  
    }  

}  

运行结果:
这里写图片描述

外观模式的优点:

  • 外观模式摆脱了客户端与子系统的耦合关系,让子系统内部的类更加容易扩展和维护。
  • 外观模式的外观角色类让子系统更加的简单易用,客户端不需要了解子系统内部的实现,也不需要跟子系统中众多的模块进行交互。只需直接跟外观角色交互即可。
  • 合理的使用外观角色可以更好的划分访问层次,有些方法是系统外的,有些方法是系统内的,需要暴露的功能集中到外观角色中,这样方便客户端使用,也可以很好的隐藏内部的实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值