外观设计模式

外观设计模式外观设计模式 一 外观设计模式 1 介绍 外观模式 Facade 也叫 过程模式 外观模式定义了一个高层接口 用以屏蔽内部子系统的细节 使得客户端只需跟这个接口发生调用 而无需关心这个子系统的内部细节 简化了客户端操作 2 UML 原理类图 外观类

大家好,我是讯享网,很高兴认识大家。

外观设计模式

一、外观设计模式

1、介绍

  • 外观模式(Facade),也叫“过程模式”。
  • 外观模式定义了一个高层接口,用以屏蔽内部子系统的细节,使得客户端只需跟这个接口发生调用,而无需关心这个子系统的内部细节。简化了客户端操作。

2、UML原理类图

在这里插入图片描述
讯享网

外观类(Facade):为客户端提供统一的调用接口,外观类知道哪些子系统负责处理请求,从而将客户端的请求代理给适当子系统对象

客户端(调用者):外观接口的调用者

子系统集合:指模块或者子系统,处理Facade对象指派的任务,功能的实际提供者

3、外观模式的使用

(1)外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性

(2)外观模式是对客户端与子系统之间的耦合关系达到解耦的目的,让子系统内部的模块更容易维护和扩展

(3)通过合理的使用外观模式,可以帮助我们更好的划分访问的层次

(4)当系统需要进行分成设计时,可以考虑使用Facade模式

(5)在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个Facade类,来提供遗留系统中比较清晰简单的接口,让新系统与Facade类交互,提高复用性

(6)不能过多或者不合理的使用外观模式。无论是使用外观模式,还是直接调用模块,要让系统有层次,利于维护为主要目的。

二、普通方式编程

1、介绍

(1)需求

智能家居建设,早上起床前30分钟,定时器执行命令,控制家中的智能家居执行以下步骤:
开启热水器
开启空调
开启咖啡机
30分钟后(起床)
开启灯光
播放新闻
放洗澡水-拿咖啡-洗澡
出门关闭各种设备

(2)弊端
  • 在Client的main方法中,创建了各个子系统(智能家居)的对象,并直接调用子系统(对象)相关方法,对于Client来说,这样会造成调用过程混乱,没有清晰的过程
  • 不利于在Client中,去维护对子系统(智能家居)的操作

2、UML

在这里插入图片描述

3、代码

/ * @description: 热水器 * @author: dashu * @create: 14:38 */ public class WaterHeater { 
    public void on(){ 
    System.out.println("打开热水器"); } public void off(){ 
    System.out.println("关闭热水器"); } } 

讯享网
讯享网/ * @description: 空调 * @author: dashu * @create: 14:39 */ public class AirConditioner { 
    public void on(){ 
    System.out.println("打开空调"); } public void off(){ 
    System.out.println("关闭空调"); } } 
/ * @description: 咖啡机 * @author: dashu * @create: 14:40 */ public class CoffeeMaker { 
    public void on(){ 
    System.out.println("打开咖啡机"); } public void off(){ 
    System.out.println("关闭咖啡机"); } } 
讯享网/ * @description: 灯光 * @author: dashu * @create: 14:43 */ public class Lamplight { 
    public void on(){ 
    System.out.println("打开灯光"); } public void off(){ 
    System.out.println("关闭灯光"); } } 
/ * @description: 新闻 * @author: dashu * @create: 14:44 */ public class Journalism { 
    public void on(){ 
    System.out.println("打开新闻"); } public void off(){ 
    System.out.println("关闭新闻"); } } 
讯享网/ * @description: 客户端 * @author: dashu * @create: 14:24 */ public class Client { 
    / * 智能家居 * 1、早上起床前30分钟,定时器执行命令,控制家中的智能家居执行以下步骤: * 开启热水器 * 开启空调 * 开启咖啡机 * 30分钟后(起床) * 开启灯光 * 播放新闻 * 放洗澡水-拿咖啡-洗澡 * 出门关闭各种设备 */ public static void main(String[] args) { 
    System.out.println("---起床前30分钟---"); WaterHeater waterHeater = new WaterHeater(); waterHeater.on(); AirConditioner airConditioner = new AirConditioner(); airConditioner.on(); CoffeeMaker coffeeMaker = new CoffeeMaker(); coffeeMaker.on(); Lamplight lamplight = new Lamplight(); lamplight.on(); Journalism journalism = new Journalism(); journalism.on(); System.out.println("---起床---"); System.out.println("放洗澡水-拿咖啡-洗澡"); System.out.println("---出门---"); waterHeater.off(); airConditioner.off(); coffeeMaker.off(); lamplight.off(); journalism.off(); } } 

二、外观设计模式编程

1、介绍

外观模式可以理解为转换一群接口,客户端只需要调用一个接口,而不用调用多个接口才能达到目的

外观模式就是解决多个复杂接口带来的使用困难,起到简化用户操作的作用

2、UML

在这里插入图片描述

3、代码

/ * @description: 热水器 * @author: dashu * @create: 14:38 */ public class WaterHeater { 
    private static WaterHeater waterHeater = new WaterHeater(); private WaterHeater() { 
    } public static WaterHeater instance(){ 
    return waterHeater; } public void on(){ 
    System.out.println("打开热水器"); } public void off(){ 
    System.out.println("关闭热水器"); } } 
讯享网/ * @description: 空调 * @author: dashu * @create: 14:39 */ public class AirConditioner { 
    private static AirConditioner airConditioner = new AirConditioner(); private AirConditioner() { 
    } public static AirConditioner instance(){ 
    return airConditioner; } public void on(){ 
    System.out.println("打开空调"); } public void off(){ 
    System.out.println("关闭空调"); } } 
/ * @description: 咖啡机 * @author: dashu * @create: 14:40 */ public class CoffeeMaker { 
    private static CoffeeMaker coffeeMaker = new CoffeeMaker(); private CoffeeMaker() { 
    } public static CoffeeMaker instance(){ 
    return coffeeMaker; } public void on(){ 
    System.out.println("打开咖啡机"); } public void off(){ 
    System.out.println("关闭咖啡机"); } } 
讯享网/ * @description: 灯光 * @author: dashu * @create: 14:43 */ public class Lamplight { 
    private static Lamplight lamplight = new Lamplight(); private Lamplight() { 
    } public static Lamplight instance(){ 
    return lamplight; } public void on(){ 
    System.out.println("打开灯光"); } public void off(){ 
    System.out.println("关闭灯光"); } } 
/ * @description: 新闻 * @author: dashu * @create: 14:44 */ public class Journalism { 
    private static Journalism journalism = new Journalism(); private Journalism() { 
    } public static Journalism instance(){ 
    return journalism; } public void on(){ 
    System.out.println("打开新闻"); } public void off(){ 
    System.out.println("关闭新闻"); } } 
讯享网/ * @description: 智能家居外观者模式 * @author: dashu * @create: 14:56 */ public class SmartHomeFacade { 
    private WaterHeater waterHeater; private AirConditioner airConditioner; private CoffeeMaker coffeeMaker; private Lamplight lamplight; private Journalism journalism; public SmartHomeFacade(){ 
    this.waterHeater = WaterHeater.instance(); this.airConditioner = AirConditioner.instance(); this.coffeeMaker = CoffeeMaker.instance(); this.lamplight = Lamplight.instance(); this.journalism = Journalism.instance(); } / * 开启 */ public void on(){ 
    waterHeater.on(); airConditioner.on(); coffeeMaker.on(); lamplight.on(); journalism.on(); } / * 关闭 */ public void off(){ 
    waterHeater.off(); airConditioner.off(); coffeeMaker.off(); lamplight.off(); journalism.off(); } } 
/ * @description: 客户端 * @author: dashu * @create: 15:04 */ public class Client { 
    / * 智能家居 * 1、早上起床前30分钟,定时器执行命令,控制家中的智能家居执行以下步骤: * 开启热水器 * 开启空调 * 开启咖啡机 * 30分钟后(起床) * 开启灯光 * 播放新闻 * 放洗澡水-拿咖啡-洗澡 * 出门关闭各种设备 */ public static void main(String[] args) { 
    System.out.println("---起床前30分钟---"); SmartHomeFacade smartHomeFacade = new SmartHomeFacade(); smartHomeFacade.on(); System.out.println("---起床---"); System.out.println("放洗澡水-拿咖啡-洗澡"); System.out.println("---出门---"); smartHomeFacade.off(); } } 
小讯
上一篇 2025-01-08 07:49
下一篇 2025-03-11 13:45

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/35353.html