JAVA设计模式——外观模式

外观模式(又称为门面模式)是一种结构型设计模式。外观模式的思想是:为子系统的各个模块提供一个统一的门面,由门面负责对客户提供服务

外观模式涉及2个角色:

  • 门面(Facade):负责为客户提供服务,将所有从客户端发来的请求委派到相应的子系统去。
  • 子系统(Subsystem):子系统中包含多个模块。可包含一个或多个子系统。每个子系统都可以被客户端直接调用,或者被门面角色调用,子系统并不知道门面的存在。


当一次的功能访问同时调用到多个对象时,可以使用外观模式。例如,在分布式应用中,通过远程调用服务,使用外观模式可以降低应用程序与服务的交互次数,同时可以降低应用程序的复杂性。

代码实现如下:

子系统:

public class ModuleA{
    public void method(){
        System.out.println("Module A");
    }
}

public class ModuleB{
    public void method(){
        System.out.println("Module B");
    }
}

public class ModuleC{
    public void method(){
        System.out.println("Module C");
    }
}

门面:

public class Facade {
    private ModuleA a = new ModuleA();
    private ModuleB b = new ModuleB();
    private ModuleC c = new ModuleC();

    public void method() {
        a.method();
        b.method();
        c.method();
    }
}

客户:

public class Client {
    private Facade facade = new Facade();

    public void method() {
        facade.method();
    }
}

// 测试
class FacadeTest {
    public static void main(String[] args) {
        Client client = new Client();
        client.method();
    }
}

运行结果:

Module A
Module B
Module C

结构图:
这里写图片描述


当想选择性地暴露子系统模块的方法时,可以使用外观模式。

代码实现如下:

子系统:

public class ModuleA{
    public void method1(){
        System.out.println("Module A 1");
    }
    public void method2(){ // 不想暴露这个方法给客户
        System.out.println("Module A 2");
    }
}

public class ModuleB{
    public void method1(){
        System.out.println("Module B 1");
    }
    public void method2(){ // 不想暴露这个方法给客户
        System.out.println("Module B 2");
    }
}

public class ModuleC{
    public void method1(){
        System.out.println("Module C 1");
    }
    public void method2(){ // 不想暴露这个方法给客户
        System.out.println("Module C 2");
    }
}

门面:

public class Facade {
    private ModuleA a = new ModuleA();
    private ModuleB b = new ModuleB();
    private ModuleC c = new ModuleC();

    public void methodA() { a.method1(); }
    public void methodB() { b.method1(); }
    public void methodC() { c.method1(); }
}

客户:

public class Client {
    private Facade facade = new Facade();

    public void method() {
        facade.methodA();
        facade.methodB();
        facade.methodC();
    }
}

// 测试
class FacadeTest {
    public static void main(String[] args) {
        Client client = new Client();
        client.method();
    }
}

运行结果:

Module A 1
Module B 1
Module C 1

结构图:
这里写图片描述


外观模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。

外观模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。

通过合理使用Facade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值