常用设计模式系列(十一)—外观模式

常用设计模式系列(十一)—外观模式

第一节

前言

截止目前,我已经完成十一篇设计模式的原创文章,设计模式已经完成十个章节,我也收获了一丢丢粉丝,未来的日子有各位大佬的陪伴,我也会更加努力的高产。今天讲解对象结构型设计模式第四章节—外观模式,什么是外观模式呢?“外观”一词比较抽象,虽然这个模式不能够通过名称来一眼看出实现的过程,但是可以这么理解,一个看着漂亮又完整的整体,其实是有许多小的部分组成,一个光芒绽放的人,也是肯定一身技能在身,找到这个人,他就能做好几个人能完成的事情,他这个人本身就集中了许多人的优点。

第二节
外观模式

外观(Facade)模式又叫做门面模式,属于较为简单的一种设计模式,是通过将多个复杂的子系统进行整合,然后提供一个统一的接口,使这些子系统更加容易被访问的模式。几个子系统集中到一起时,这个模式就对外只有一个统一接口,可以访问子系统的方法,外部的程序不用关心内部系统实现的具体细节,在我们开发的过程中,许多人就会不自觉的使用外观模式。

在这里插入图片描述

在这里插入图片描述

其实这个模式很好理解,将多个子类在一个统一类进行整合,然后整合类作为统一入口使用,例如在项目开发过程中,我们的control(控制)层去调用service层进行实现,service层是整合了多个dao来完成业务开发,或者service层依赖别的service层,融合到一起,入口为这个整合的service类,control可以通过service查找dao层去数据库查询的数据,这样就能完成外观模式。

注意:外观模式就是将多个子系统的入口进行整合,在同一的接口完成,三个系统分别是三个入口,在这个接口中就是三个方法。

在这里插入图片描述

一个朋友离职以后,换了一家新的公司,然后到了新的城市需要租房子,为了快速找到房子,这个朋友就找到了房产中介,他考虑的是一室一厅或者两室一厅的房子,这个房产中介就拿着两把钥匙带着朋友看房子去了,你可以理解为中介就是外观角色,整合了资源,但是资源数不变,每个房东的房子在这里汇聚,真正的房东的房子就是子系统,房产公司就是抽象外观角色。

在这里插入图片描述

image

第三节

代码实现

本次代码实现使用一个外观角色完成,多个外观角色同理

1.创建子系统A和子系统B

package com.yang.facade;


/**
 * @ClassName SubSystemOne
 * @Description 子系统——房东A
 * @Author IT小白架构师之路
 * @Date 2020/12/21
 * @Version 1.0
 **/
public class SubSystemOne {
    /**
     * 一室一厅的房子
     */
    public void oneRoom(){
        System.out.println("一室一厅的房子");
    }
}


package com.yang.facade;


/**
 * @ClassName SubSystemTwo
 * @Description 子系统-房东B
 * @Author IT小白架构师之路
 * @Date 2020/12/21
 * @Version 1.0
 **/
public class SubSystemTwo {
    /**
     * 两室一厅的房子
     */
    public void twoRoom(){
        System.out.println("两室一厅的房子");
    }
}

2.创建抽象外观角色

package com.yang.facade;


/**
 * @ClassName OrderService
 * @Description 抽象外观
 * @Author IT小白架构师之路
 * @Date 2020/12/21
 * @Version 1.0
 **/
public interface AbstractFacade {
    /**
     * 一室一厅
     */
    public void oneRoom();
    /**
     * 两室一厅
     */
    public void twoRoom();
}

3.创建外观角色

package com.yang.facade;


/**
 * @ClassName Facade
 * @Description 外观角色(前台接待人员)
 * @Author IT小白架构师之路
 * @Date 2020/12/21
 * @Version 1.0
 **/
public class Facade implements AbstractFacade {
    //房东A
    private SubSystemOne subSystemOne = new SubSystemOne();
    //房东B
    private SubSystemTwo subSystemTwo = new SubSystemTwo();


    /**
     * 一室一厅
     */
    public void oneRoom() {
        System.out.println("中介带着看房子");
        subSystemOne.oneRoom();
    }


    /**
     * 两室一厅
     */
    public void twoRoom() {
        System.out.println("中介带着看房子");
        subSystemTwo.twoRoom();
    }
}

4.创建客服端进行测试

package com.yang.facade;


/**
 * @ClassName Client
 * @Description 注释
 * @Author IT小白架构师之路
 * @Date 2020/12/21
 * @Version 1.0
 **/
public class Client {
    public static void main(String[] args) {
        //外观对象
        AbstractFacade facade = new Facade();
        System.out.println("去看房子");
        System.out.println("-----------------分割线---------------");
        facade.oneRoom();
        System.out.println("-----------------分割线---------------");
        facade.twoRoom();
    }
}

5.测试结果如下,完成了外观模式的职责

去看房子
-----------------分割线---------------
中介带着看房子
一室一厅的房子
-----------------分割线---------------
中介带着看房子
两室一厅的房子

第四节

外观模式优缺点及适用场景分析

优点:

  1. 可以将系统中多个功能的接口进行整合,在一个类中进行聚合,方便客户端使用。

  2. 外观模式降低了客户端与子系统之间的耦合度

  3. 对客户端屏蔽了子系统组件,减少了客户端使用的对象数量,也屏蔽了处理过程

缺点:

  1. 增加新的子系统时,需要修改外观角色和客户端代码,违背了设计模式的“开闭原则”。

  2. 子系统能被任何外观类使用,后期改造风险增加

适用场景:

  1. 适用于一个系统内部接口较为复杂,但需要提供统一接对外调用的场景。

  2. 当客户端使用的子系统对象过多且臃肿时,可以引入外观模式改造,提高独立性。

  3. 系统中分层进行开发时,外观模式可以隔离不同层的调用关系错乱,统一管理。

扫描二维码

关注我吧

IT小白架构师之路

image

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT小白架构师之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值