Java版设计模式之【外观模式】

391 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。

概述

外观模式,又称为门面模式,是结构型设计模式的一种。它能够为程序库或框架等一些相对复杂的类提供一个简单的接口,使得子系统更容易使用。

角色

子系统:可以同时有一个或多个子系统,每一个子系统都不是一个单独的类,而是一个类的集合。对于子系统而言,它不知道外观的存在,外观对它来说仅仅是另一个客户端而已。

外观:提供了给客户端访问子系统的接口,会将所有从客户端发来的请求委派到相应的子系统中,本身没有实际的业务逻辑。

模板

子系统:定义一个医院接口以及各个区域实现类。

/**
 * 医院接口
 */
public interface Hospital {
    void go();
}
/**
 * 挂号处
 */
public class ReceptionArea implements Hospital{
    @Override
    public void go() {
        System.out.println("到医院挂号处挂号");
    }
}
/**
 * 门诊部
 */
public class OutpatientDepartment implements Hospital{
    @Override
    public void go() {
        System.out.println("到医院门诊部看病");
    }
}
/**
 * 收费处
 */
public class TollOffice implements Hospital{
    @Override
    public void go() {
        System.out.println("到医院收费处付费");
    }
}
/**
 * 药房
 */
public class Pharmacy implements Hospital{
    @Override
    public void go() {
        System.out.println("到医院药房取药");
    }
}

外观:医院接待员,负责解答指引病人到对应区域。

/**
 * 接待员
 */
public class Receptionist {
    /**
     * 挂号处
     */
    private Hospital receptionArea;
    /**
     * 门诊部
     */
    private Hospital outpatientDepartment;
    /**
     * 收费处
     */
    private Hospital tollOffice;
    /**
     * 药房
     */
    private Hospital pharmacy;

    /**
     * 做为医院的接待员,对内部业务都要熟悉
     */
    public Receptionist() {
        this.receptionArea = new ReceptionArea();
        this.outpatientDepartment = new OutpatientDepartment();
        this.tollOffice = new TollOffice();
        this.pharmacy = new Pharmacy();
    }

    /**
     * 医院看病流程
     */
    public void medicalProcedures(){
        goReceptionArea();
        goOutpatientDepartment();
        goTollOffice();
        goPharmacy();
    }

    /**
     * 去挂号处
     */
    public void goReceptionArea(){
        receptionArea.go();
    }

    /**
     * 去门诊部
     */
    public void goOutpatientDepartment(){
        outpatientDepartment.go();
    }

    /**
     * 去收费处
     */
    public void goTollOffice(){
        tollOffice.go();
    }

    /**
     * 去药房
     */
    public void goPharmacy(){
        pharmacy.go();
    }
}

客户端:使用外观类实现看病指引,由外观类去调用各个子系统指向业务逻辑。

public class FacadePattern {
    public static void main(String[] args) {
        // 创建一个接待员对象
        Receptionist receptionist = new Receptionist();

        // 询问接待员看病流程
        receptionist.medicalProcedures();

        System.out.println("===============================");

        // 询问接待员取药问题
        receptionist.goPharmacy();
        // 询问接待员挂号问题
        receptionist.goReceptionArea();
        // 询问接待员付费问题
        receptionist.goTollOffice();
        // 询问接待员看病问题
        receptionist.goOutpatientDepartment();
    }
}

image.png

小结

优点

减少依赖:客户端请求均通过外观调用,不依赖多个子系统。

灵活:不管子系统内部如何变化,只要外观提高的接口不变,对于客户端来说均不会受到影响。

安全:外观类中没有提供的方法,外界就无法访问,有效提高系统安全性。

缺点

耦合性高:外观类可能会成为与程序中所有类都耦合的超级对象。

适用场景

  • 可以为复杂的模块或子系统提供直接接口供外界访问。
  • 使子系统相对独立,外界对于子系统的访问并不需要知道具体操作。
  • 提高安全性,防止开发水平较低的人员误用复杂子系统功能导致问题发生。

最后

文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!!!

如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!