前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式-外观模式

设计模式-外观模式

作者头像
逍遥壮士
发布2020-09-18 11:25:22
3790
发布2020-09-18 11:25:22
举报
文章被收录于专栏:技术趋势技术趋势

背景

一般想DIY电脑个性人配置,要么自己来组装(很费劲),要么买在电脑城买好组件找师师傅帮你装,不用理那么多,而外观模式就是类似这种为你组装好的人员。

外观模式是什么?

外观模式也叫门面模式,是一种系统与外部之间通信通过一个统一的门面对象进行。

外观模式可以干嘛?

主要解决不同系统之间交互,由统一的入口(门面)来进行交互,这样使用系统之间互相通信复杂降低,并且也不需要去知道其他系统的具体实现及业务,可以降低系统一系统之间的复杂度。

优点:

低耦合高灵活:减少系统之间的相互依赖;

高内聚:有问题外部也是不知道的,只会怪接口,所以内部好处理掉这些问题。

缺点:

不符合开闭原则,增删改可能影响原来功能和流程;

外观模式类图

源码下载:https://gitee.com/hong99/design-model/issues/I1IMES

实现代码

代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/5/29 11:20
 * @Description:抽象组件
 */
public interface IModule {
    //安装组件
    void installModule();
}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/5/29 11:21
 * @Description:CPU
 */
public class Cpu implements IModule {
    @Override
    public void installModule() {
        System.out.println("安装CPU");
    }
}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/5/29 11:22
 * @Description:显示器
 */
public class Displayer implements IModule {
    @Override
    public void installModule() {
        System.out.println("安装显示器");
    }
}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/5/29 11:22
 * @Description:
 */
public class MemoryBank implements IModule {
    @Override
    public void installModule() {
        System.out.println("内存条");
    }
}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/5/29 11:23
 * @Description:其他组件
 */
public class Other implements IModule {
    @Override
    public void installModule() {
        System.out.println("安装其他组件 键盘、鼠标、硬盘等");
    }
}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/5/29 11:23
 * @Description:构建者
 */
public class ComputerMarker  {
    private Cpu cpu;
    private Displayer displayer;
    private MemoryBank memoryBank;
    private Other other;

    public ComputerMarker() {
        this.cpu = new Cpu();
        this.displayer = new Displayer();
        this.memoryBank = new MemoryBank();
        this.other = new Other();
    }

    public void installCput(){
        cpu.installModule();
    }

    public void installDisplayer(){
        displayer.installModule();
    }

    public void installMemoryBank(){
        memoryBank.installModule();
    }

    public void installOther(){
        other.installModule();
    }

}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/5/29 11:26
 * @Description:安装电脑
 */
public class Client {
    public static void main(String[] args) {
        ComputerMarker computerMarker = new ComputerMarker();
        computerMarker.installCput();
        computerMarker.installDisplayer();
        computerMarker.installMemoryBank();
        computerMarker.installOther();
        System.out.println("电脑装好了直接拿回家!");
    }
}

结果

代码语言:javascript
复制
安装CPU
安装显示器
内存条
安装其他组件 键盘、鼠标、硬盘等
电脑装好了直接拿回家!

源码下载:https://gitee.com/hong99/design-model/issues/I1IMES

最后

门面模式,存在的最大缺陷就是不符合开闭原则,一但要新增删原有的东西,真的很麻烦,并且还可能影响到原来的功能或流程,所以这个模式,利弊都挺大的,特别是项目迭代非常快,用到这个模式就很坑爹,如果像是稳定的接系统,系统与系统之间内部都很复杂,并且双方之间关系藕断丝连,就可以抽出一个统一接口(门面),倒是一个不错的选择。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术趋势 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
  • 源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档