当前位置: 首页 > article >正文

设计模式篇---外观模式

文章目录

    • 概念
    • 结构
    • 实例
    • 总结

概念

外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式引入了一个新的外观类,它为多个业务类的调用提供了一个统一的入口。主要优点是对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数量。
举个例子,比如查询人员的权限,客户端可以调用外观类的方法,外观类中封装一个方法,方法里面依次调用两个实现类,该方法先是示查询出人员的角色,然后根据查出来的角色去查询角色的权限。将客户端与实现类进行解耦,就不用客户端调两次了,客户端只需要调用外观类一次即可。

结构

在这里插入图片描述

Facade(外观角色):外观角色中知道一个或多个子系统的功能和责任。它用来将客户端发来的请求委派到相应的子系统,传递给乡音的子系统对象处理。
SubSystem(子系统角色):系统中可以有一个或多个子系统角色,每一个子系统都可以被客户端直接调用,或者被外观角色调用。子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已。

实例

比如我们上班回家后,要做的事情依次是开门、开灯、打开电视,现在用外观模式来完成这个过程。
在这里插入图片描述

Door 类

public class Door {

    public void openDoor(){
        System.out.println("门开了");
    }

}

Lamp类

public class Lamp {

    public void turnOnLight(){
        System.out.println("灯开了");
    }
}

TV类

public class TV {

    public void turnOnTv() {
        System.out.println("电视开了");
    }

}

Facade类

public class Facade {
    private TV tv = new TV();
    private Door door = new Door();
    private Lamp lamp = new Lamp();

    public void open() {
        tv.turnOnTv();
        door.openDoor();
        lamp.turnOnLight();
    }

}

Client 端

public class Client {

    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.open();
    }
}

如果不用外观模式,则客户端的调用方式是这样的:

public class Client {

    public static void main(String[] args) {
        Door door = new Door();
        Lamp lamp = new Lamp();
        TV tv = new TV();
        door.openDoor();
        lamp.turnOnLight();
        tv.turnOnTv();
    }
}

上面是客户端直接调用业务实现类,需要依赖三个子系统,而使用外观模式,则只需要关联一个外观类,降低了系统的耦合度。

总结

优点:
1、它对客户端屏蔽了子系统,减少了客户端所需处理的对象数目,客户端代码变得很简单。
2、它实现了子系统和客户端的松耦合关系,使得子系统的变化不会影响到客户端,只需要更改外观类即可。
缺点:
1、违背开闭原则,有新的子系统加入需要修改外观类。

外观模式和建造者模式的思路很相似。外观模式是将复杂的子系统操作给外观类,客户端直接调用外观类即可;建造者模式是将复杂的操作给指挥者,指挥者内部指挥建造者创建,客户端直接关联指挥者即可。


http://www.kler.cn/news/147874.html

相关文章:

  • 搜索的剪枝
  • 论文阅读:“Appearance Capture and Modeling of Human Teeth”
  • 【复杂网络建模】——ER网络度分布、无标度网络度分布
  • centos 7.7 安装Python-3.7.4
  • 华为云编译构建CodeArts Build常见问答汇总
  • VMware系列:此平台不支持虚拟化 Intel-VT-x/EPT 或 AMD-V/RVI
  • 编译器设计02-前端概述
  • .c怎么转.exe?10000字长文带你深剖编译过程!
  • Vatee万腾科技新高峰:Vatee前瞻性创新的数字化之力
  • 西南科技大学电路分析基础实验A1(元件伏安特性测试 )
  • 播放器开发(三):FFmpeg与SDL环境配置
  • 村村通工程(Prim算法)/最小生成树Prim算法【数据结构】
  • Android : SQLite 增删改查—简单应用
  • F5社区学习心得分享:如何克服云迁移挑战?
  • C#文件流FileStream类
  • GEE教程——提取NASA NEX-GDDP 数据中的指定时间范围内的pr数据(含超限提示)
  • 聊聊VMware vSphere
  • C++不同平台下的RTTI实现
  • 云服务器:未来的计算力量
  • 如何解决中小制造业企业信息化难题?
  • Visual Studio(VS) C++程序LNK2005错误,提示“error LNK2005: _XXX已经在xxx.obj中定义”解决方案
  • Pangolin报错
  • 详解HTTP协议(介绍--版本--工作过程--Fiddler 抓包显示--请求响应讲解)
  • windows安装 evo
  • hadoop集群环境搭建和常用命令
  • 9.Spring 整合 Redis
  • Dockerfile讲解
  • HCIP-九、路由控制
  • Netty实现websocket且实现url传参的两种方式(源码分析)
  • 揭秘论文开题报告写作技巧,全程无忧,附赠技术路线图模板!