Java设计模式 之门面模式

本文深入探讨了门面模式的设计理念,介绍了如何通过门面模式简化子系统操作,提高代码的可读性和可维护性。文章通过一个写信的案例,详细展示了门面模式的代码实现过程,以及如何通过门面模式增强系统的扩展性。

门面模式思想

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

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

门面模式涉及2个角色

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

案例前言

给女朋友写情书,写信的过程:

  • 1、先写信的内容。
  • 2、然后写信封上的地址。
  • 3、然后把信放到信封中封好。
  • 4、投递到信箱中进行邮递。

比如到了情人节,要给很多个女朋友写信,每个步骤都要自己做,那不要累死。还好,现在邮局开发了一个新业务,你只要把信件的必要信息告诉我,我给你发,我来做这四个过程,你就不要管了,只要把信件交给我就成了。
在这里插入图片描述

案例代码实现

在这里插入图片描述
写信接口,抽象出写信需要的方法:

public interface LetterProcess {
    //首先要写信的内容
    void writeContext(String context);
    //其次写信封
    void fillEnvelope(String address);
    //把信放到信封里
    void letterInotoEnvelope();
    //然后邮递
    void sendLetter();
}

实现写信的方法:

public class LetterProcessImpl implements LetterProcess {
    //写信
    public void writeContext(String context) {
        System.out.println("填写信的内容...." + context);
    }
    //在信封上填写必要的信息
    public void fillEnvelope(String address) {
        System.out.println("填写收件人地址及姓名...." + address);
    }
    //把信放到信封中,并封好
    public void letterInotoEnvelope() {
        System.out.println("把信放到信封中....");
    }
    //塞到邮箱中,邮递
    public void sendLetter() {
        System.out.println("邮递信件...");
    }
}

定义门面,封装了写信过程的步骤,并对外提供一个方法:

public class ModenPostOffice {
    private LetterProcess letterProcess = new LetterProcessImpl();

    //写信,封装,投递,一体化了
    public void sendLetter(String context, String address) {
        //帮你写信
        letterProcess.writeContext(context);
        //写好信封
        letterProcess.fillEnvelope(address);
        //把信放到信封中
        letterProcess.letterInotoEnvelope();
        //邮递信件
        letterProcess.sendLetter();
    }
}

客户只要把信的内容以及收信地址给邮局,邮局就会把信写好,封好,并发送出去:

public class Client {
    public static void main(String[] args) {
        //现代化的邮局,有这项服务,邮局名称叫Hell Road
        ModenPostOffice hellRoadPostOffice = new ModenPostOffice();
        //你只要把信的内容和收信人地址给他,他会帮你完成一系列的工作;
        String address = "Happy Road No. 666,God Province,Heaven"; //定义一个地址
        String context = "Hello,It's me,do you know who I am? I'm your old lover. I'd like to....";
        hellRoadPostOffice.sendLetter(context, address);
    }
}

运行结果:
在这里插入图片描述
上面使用了门面模式后,系统的扩展性也有了很大的提高,突然一个非常时期,国家需要对邮局寄出去的所有进行检查,只需要在邮局寄出去的时候进行检查,这个变更对于客户来说是透明的,他也不用了解,一切邮局已经帮做了。

修改邮局类,增加警察,警察在发送信件之前对信件进行检查:

public class ModenPostOffice {
    private LetterProcess letterProcess = new LetterProcessImpl();
    private Police letterPolice = new Police();

    //写信,封装,投递,一体化了
    public void sendLetter(String context, String address) {
        //帮你写信
        letterProcess.writeContext(context);
        //写好信封
        letterProcess.fillEnvelope(address);
        //警察要检查信件了
        letterPolice.checkLetter(letterProcess);
        //把信放到信封中
        letterProcess.letterInotoEnvelope();
        //邮递信件
        letterProcess.sendLetter();
    }
}

总结

门面模式是一个很好的封装方法,一个子系统比较复杂的实现,比如算法或者业务比较复杂,就可以封装出一个或多个门面出来,项目的结构简单,而且扩展性非常好。还有,在一个较大项目中的时候,为了避免人员带来的风险,也可以使用这个模式,技术水平比较差的成员,尽量安排独立的模块(Sub System),然后把他写的程序封装到一个门面里,尽量让其他项目成员不用看到这些不好的代码,看也看不懂。

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

代码实现如下:
子系统:

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 Facade {
    private ModuleA a = new ModuleA();
    private ModuleB b = new ModuleB();

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

客户:

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

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

    public static void main(String[] args) {
        Client2 client2 = new Client2();
        client2.method();
    }
}

运行结果:
在这里插入图片描述

优点

  • 门面模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。
  • 门面模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。
  • 通过合理使用Facade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值