设计模式 11 外观模式

字节探雪人
• 阅读 86
外观模式(Facade Pattern)属于结构型模式

概述

在生活中,经常遇到这样的情况:办理一个业务,需要找很多部门签字盖章,这些部门往往距离较远,无奈只得四处奔波。这时候相信所有人都有一个同样的诉求:要是找一个部门就能办理完所有业务就好了!

编程来源于生活,生活中是这样,代码中也是这样。如果一个业务逻辑需要调几个独立的系统,不仅编写复杂,还不方便管理和维护,任意系统的业务变更都将影响很多地方。这时也是同样的诉求,要是调一个系统就能解决业务就好了!

这时外观模式就应运而生了,它隐藏了各系统间调用的复杂性,并向客户端提供了可以一次访问就实现各系统间逻辑的接口。

外观模式充分体现了迪米特法则。一般大型项目都有很多个子系统,可以在这些子系统的上面加一个门面(Facade),当外部需要与各个子系统交互时,无需再去单独调用各个子系统,而是直接与门面进行交互,再由门面与后面的各个子系统操作。这样方便了调用方代码的编写,统一找门面就行,不需要去详细了解各个子系统,并且,当子系统需要修改时,只需修改门面中的逻辑,不需要变动调用方的代码,遵循迪米特法则尽可能少的交互,极大的提高了便利性和健壮性。

代码实现

这里以找各个部门办理业务为例介绍外观模式:

1、定义A部门

/**
 * A部门
 */
public class DepartmentA {

    /**
     * 办理业务
     */
    public void business() {
        System.out.println("A部门办理了业务");
    }
    
}

2、定义B部门

/**
 * B部门
 */
public class DepartmentB {

    /**
     * 办理业务
     */
    public void business() {
        System.out.println("B部门办理了业务");
    }
    
}

3、定义C部门

/**
 * C部门
 */
public class DepartmentC {

    /**
     * 办理业务
     */
    public void business() {
        System.out.println("C部门办理了业务");
    }
    
}

4、定义外观部门

/**
 * 外观部门
 */
public class Facade {

    /**
     * A部门
     */
    private DepartmentA departmentA;

    /**
     * B部门
     */
    private DepartmentB departmentB;

    /**
     * C部门
     */
    private DepartmentC departmentC;

    /**
     * 无参构造器中给包装的部门赋值
     */
    public Facade() {
        
        departmentA = new DepartmentA();
        departmentB = new DepartmentB();
        departmentC = new DepartmentC();
    }

    /**
     * 办理业务
     */
    public void business() {
        
        departmentA.business();
        departmentB.business();
        departmentC.business();
    }

}

5、调用

// 找到外观部门
Facade facade = new Facade();
// 办理业务
facade.business();

输出结果:

A部门办理了业务
B部门办理了业务
C部门办理了业务

如此即实现了找一个部门就办理了多个部门的业务。不管多复杂的业务,麻烦的都是外观部门,而不是办理业务的人。哪个部门的业务发生变化了,外观部门去跟它们沟通协调做相应调整就行,办理业务的人不用再熟悉调整后的业务,还像往常一样找外观部门办理即可。

这就是外观模式带来的巨大便利,希望现实生活中如此场景的外观模式也早日到来!

优缺点

优点

1、减少系统相互依赖。

2、提高灵活性。

3、提高了安全性。

缺点

不符合开闭原则,如果要改东西很复杂,继承重写都不合适。

使用场景

1、为复杂的模块或子系统提供外界访问的模块。

2、子系统相对独立。

3、预防低水平人员带来的风险。

注意事项

在层次化结构中,可以使用外观模式定义系统中每一层的入口。


参考

https://www.bilibili.com/video/BV1u3411P7Na?p=19\&vd\_source=299f4bc123b19e7d6f66fefd8f124a03

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
3年前
java中的23种设计模式
java中一共23种设计模式!按照目的来分,设计模式可以分为创建型模式、结构型模式和行为型模式。创建型模式用来处理对象的创建过程;结构型模式用来处理类或者对象的组合;行为型模式用来对类或对象怎样交互和怎样分配职责进行描述。创建型模式用来处理对象的创建过程,主要包含以下5种设计模式:工厂方法模
伊丽莎白-简 伊丽莎白-简
4年前
简说设计模式——外观模式
一、什么是外观模式  有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个好帮手,支付宝里就有许多的基金,它将投资者分散的资金集中起来,交由专业的经理人进行管理,投资于股票、债券、外汇等领域,而基金投资的收益归持有者所有,管理机
Wesley13 Wesley13
3年前
Java计模模式之六
前言在上一篇(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fzhaosq%2Fp%2F10219533.html)中我们学习了结构型模式的外观模式和装饰器模式。本篇则来学习下组合模式和过滤器模式。组合模式简介
Wesley13 Wesley13
3年前
mysql select将多个字段横向合拼到一个字段
表模式:CREATE TABLE tbl_user (  id int(11) NOT NULL AUTO_INCREMENT,  name varchar(255) DEFAULT NULL,  age int(11) DEFAULT NULL,  PRIMARY KEY (id)
Wesley13 Wesley13
3年前
Java中23种设计模式详解
Java中23种设计模式1\.设计模式31.1创建型模式41.1.1工厂方法41.1.2抽象工厂61.1.3建造者模式101.1.4单态模式131.1.5原型模式151.2结构型模式171.2.1适配器模式171.2.2桥接模式191.2.3组合
Wesley13 Wesley13
3年前
Java Design Patterns
java的设计模式大体上分为三大类:创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模
Wesley13 Wesley13
3年前
00_设计模式之语言选择
设计模式之语言选择设计模式简介背景设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式(Designpattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的
Wesley13 Wesley13
3年前
Java描述设计模式(06):建造者模式
一、生活场景基于建造者模式,描述软件开发的流程。1、代码实现/基于建造者模式描述软件开发/publicclassC01_InScene{publicstaticvoidmain(Stringargs){B
Wesley13 Wesley13
3年前
Java描述设计模式(12):外观模式
本文源码:GitHub·点这里(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2Fcicadasmile%2Fmodelarithmeticparent)||GitEE·点这里(https://gitee.com/cicadasmile/modela
Wesley13 Wesley13
3年前
Java设计模式_(结构型)_代理模式
引用百科即ProxyPattern,23种常用的面向对象软件的设计模式之一。代理模式的定义:为其他对象提供一种代理(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fbaike.baidu.com%2Fitem%2F%25E4%25BB%25A3%25E7%2590%25