笨蛋学设计模式结构型模式-外观模式【10】

2024-01-19 00:12

本文主要是介绍笨蛋学设计模式结构型模式-外观模式【10】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

结构型模式-外观模式

    • 7.4外观模式:arrow_up::arrow_up::arrow_up:
      • 7.4.1概念
      • 7.4.2场景
      • 7.4.3优势 / 劣势
      • 7.4.4外观模式可分为
      • 7.4.5外观模式
      • 7.4.6实战
        • 7.4.6.1题目描述
        • 7.4.6.2输入描述
        • 7.4.6.3输出描述
        • 7.4.6.4实战
      • 7.4.7总结
      • 外观模式

7.4外观模式⬆️⬆️⬆️

7.4.1概念

​ 外观模式也称门面模式,外观模式定义了一个高层接口,该接口为子系统中的一组接口提供一个统一的接口,从而简化了子系统的使用。同时隐藏了子系统内部的复杂性,并向客户端提供了一个更简单的接口,使得子系统变得更加容易。

7.4.2场景

​ 当我们想看电视时,在电视上或者电视遥控器上都有一个电源启动 / 关闭按钮,这个按钮掩盖了电视机内部的所有复杂性,当我们想看电视时按下遥控器上的电源启动按钮,或者想调整电视音量时,又或者想调换电视节目等,也是通过电视遥控器上的某一个按钮来控制电视机,完成对应的电视复杂操作。

7.4.3优势 / 劣势

  • 简化代码:提高了代码的可读性以及可维护性
  • 提高代码重用性:对子系统进行修改时,只需要修改外观类
  • 模块化设计:将子系统封装在一个外观对象中,可以更容易地进行模块化设计和维护

  • 过度抽象:若过度抽象,可能会隐藏子系统的重要信息,导致难以进行有效的调试和维护
  • 性能影响:由于多了一层封装,可能会对性能产生一定的影响

7.4.4外观模式可分为

  • 外观类:对外提供一个统一的高层次接口,使复杂的子系统变得更易使用
  • 子系统类:实现子系统的功能,处理外观类指派的任务

7.4.5外观模式

package com.technologystatck.designpattern.mode.appearance;public class Appearance {public static void main(String[] args) {//创建外观对象Facade facade = new Facade();//客户端通过外观类调用子系统的操作facade.facadeOperation();}
}//子系统A
class SubsystemA{public void operationA(){System.out.println("SubsystemA operation");}
}//子系统B
class SubsystemB{public void operationB(){System.out.println("SubsystemB operation");}
}//子系统C
class SubsystemC{public void operationC(){System.out.println("SubsystemC operation");}
}//外观类
class Facade{private SubsystemA subsystemA;private SubsystemB subsystemB;private SubsystemC subsystemC;//实例化三个子系统public Facade() {this.subsystemA = new SubsystemA();this.subsystemB = new SubsystemB();this.subsystemC = new SubsystemC();}//外观方法,封装了对子系统的操作public void facadeOperation(){subsystemA.operationA();subsystemB.operationB();subsystemC.operationC();}
}

7.4.6实战

7.4.6.1题目描述

小明家的电源总开关控制了家里的三个设备:空调、台灯和电视机。每个设备都有独立的开关密码,分别用数字1、2和3表示。即输入1时,空调关闭,输入2时,台灯关闭,输入3时,电视机关闭,当输入为4时,表示要关闭所有设备。请你使用外观模式编写程序来描述电源总开关的操作。

7.4.6.2输入描述

第一行是一个整数 N(1 <= N <= 100),表示后面有 N 行输入。

接下来的 N 行,每行包含一个数字,表示对应设备的开关操作(1表示关闭空调,2表示关闭台灯,3表示关闭电视机,4表示关闭所有设备)。

7.4.6.3输出描述

输出关闭所有设备后的状态,当输入的数字不在1-4范围内时,输出Invalid device code.

7.4.6.4实战
package com.technologystatck.designpattern.mode.appearance;import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int nums = scanner.nextInt();
//        scanner.nextLine();//创建外观类对象,也就是电源开关
//        PowerFacade powerFacade =null;
//        for(int i=0;i<nums;i++){
//            int systemType = scanner.nextInt();
//            powerFacade= new PowerFacade();
//            powerFacade.facadeOperation(systemType);
//        }//定义数组存放用户输入int[] inputs=new int[nums];for(int i=0;i<nums;i++){inputs[i]=scanner.nextInt();}//创建外观类对象,也就是电源开关PowerFacade powerFacades=new PowerFacade();for(int j=0;j<nums;j++){powerFacades.facadeOperation(inputs[j]);}}
}//创建三个子系统
//电视机子系统
class Television{public void operationTV(){System.out.println("Television is turned off.");}
}
//空调子系统
class AirConditioner{public void operationAC(){System.out.println("Air Conditioner is turned off.");}
}//台灯子系统
class TableLamp{public void operationTL(){System.out.println("Table Lamp is turned off.");}
}//创建外观类,来操控三个子系统
class PowerFacade{private Television television;private AirConditioner airConditioner;private TableLamp tableLamp;//实例化三个子系统public PowerFacade(){this.television=new Television();this.airConditioner=new AirConditioner();this.tableLamp=new TableLamp();}//外观方法,封装了对子系统的操作public void facadeOperation(int type){if(type==1){television.operationTV();}else if (type ==2 ) {this.airConditioner.operationAC();}else if(type==3){tableLamp.operationTL();}else if(type==4){System.out.println("All devices are off.");}else{System.out.println("Invalid device code.");}}
}

7.4.7总结

  • 外观模式

  • 优点:隐藏系统的内部细节,简化复杂的子系统,只需要通过已经封装好了的方法去调用

  • 总结:将一个或多个难度过于复杂的子系统包装为一个单独的接口,以供客户端只需要与外观对象交互

  • 场景

    • 当系统的接口过于复杂时,可以使用外观模式将系统的接口进行封装,让客户端调用简单的方法完成操作
    • 当系统存在多个子系统,且子系统之间存在依赖时,外观模式可以将不同子系统之间的依赖关系进行解耦

这篇关于笨蛋学设计模式结构型模式-外观模式【10】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/620711

相关文章

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

C++中的解释器模式实例详解

《C++中的解释器模式实例详解》这篇文章总结了C++标准库中的算法分类,还介绍了sort和stable_sort的区别,以及remove和erase的结合使用,结合实例代码给大家介绍的非常详细,感兴趣... 目录1、非修改序列算法1.1 find 和 find_if1.2 count 和 count_if1

Redis中群集三种模式的实现

《Redis中群集三种模式的实现》Redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1. Redis三种模式概述2、Redis 主从复制2.1 主从复制的作用2.2 主从复制流程2

深入理解MySQL流模式

《深入理解MySQL流模式》MySQL的Binlog流模式是一种实时读取二进制日志的技术,允许下游系统几乎无延迟地获取数据库变更事件,适用于需要极低延迟复制的场景,感兴趣的可以了解一下... 目录核心概念一句话总结1. 背景知识:什么是 Binlog?2. 传统方式 vs. 流模式传统文件方式 (非流式)流

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

SQL Server身份验证模式步骤和示例代码

《SQLServer身份验证模式步骤和示例代码》SQLServer是一个广泛使用的关系数据库管理系统,通常使用两种身份验证模式:Windows身份验证和SQLServer身份验证,本文将详细介绍身份... 目录身份验证方式的概念更改身份验证方式的步骤方法一:使用SQL Server Management S