设计模式之外观模式笔记

news/2024/7/2 23:42:59

设计模式之外观模式笔记

  • 说明
  • Facade(外观)
  • 目录
  • 外观模式示例类图
    • 电灯类
    • 电视机类
    • 空调类
    • 智能音箱外观类
    • 测试类

说明

记录下学习设计模式-外观模式的写法。JDK使用版本为1.8版本。

Facade(外观)

意图:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
结构:
在这里插入图片描述

其中:

  • Facade知道哪些子系统类负责处理请求;将客户的请求代理给适合的子系统对象。
  • Subsystem classes实现子系统的功能;处理有Facade对象指派的任务;没有Facade的任何相关信息,即没有指向Facade的指针。

适用性:

  • 对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。
  • 当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
  • 当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。

目录

在这里插入图片描述

外观模式示例类图

在这里插入图片描述
以该UML类图实现外观模式示例。

电灯类

package com.example.deesign_patterns.facade;

//电灯类
public class Light {

    //开灯
    public void on(){
        System.out.println("打开电灯。。。");
    }

    //关灯
    public void off(){
        System.out.println("关闭电灯。。。");
    }
}

电视机类

package com.example.deesign_patterns.facade;

//电视机类
public class TV {

    //开电视机
    public void on(){
        System.out.println("打开电视机。。。");
    }

    //关电视机
    public void off(){
        System.out.println("关闭电视机。。。");
    }
}

空调类

package com.example.deesign_patterns.facade;

//空调类
public class AirCondition {

    //开空调
    public void on(){
        System.out.println("打开空调。。。");
    }

    //关空调
    public void off(){
        System.out.println("关闭空调。。。");
    }
}

智能音箱外观类

package com.example.deesign_patterns.facade;

//智能音箱外观类,用户主要和该类对象进行交互
public class SmartAppliancesFacade {

    //聚合电灯对象、电视机对象、空调对象
    private Light light;
    private TV tv;
    private AirCondition airCondition;

    public SmartAppliancesFacade() {
        light=new Light();
        tv=new TV();
        airCondition=new AirCondition();
    }

    //语音控制方法
    public void say(String message){
        if(message.contains("打开")){
            on();
        }else if(message.contains("关闭")){
            off();
        }else {
            System.out.println("我还听不懂你说的!!!");
        }
    }

    //一键打开功能
    private void on(){
        light.on();
        tv.on();
        airCondition.on();
    }

    //一键关闭功能
    private void off(){
        light.off();
        tv.off();
        airCondition.off();
    }
}

测试类

package com.example.deesign_patterns.facade;

//测试类
public class Client {

    public static void main(String[] args) {
        //创建智能音箱对象
        SmartAppliancesFacade facade=new SmartAppliancesFacade();
        //控制家电
        facade.say("打开家电");
        System.out.println("===============");
        facade.say("关闭家电");
    }
}

在这里插入图片描述

好处:

  • 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
  • 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。

缺点:
不符合开闭原则,修改起来很麻烦。


http://lihuaxi.xjx100.cn/news/1269746.html

相关文章

2023.6.15钛动科技java实习第一轮技术面试

第一次面试,又是在考六级期间,也缺乏经验和准备。无笔试,问的简历项目比较多,java基础较多,聊了半个小时。这次的面试应该是挂掉的,面试官建议我多背背八股文和面试题哈 线下面试问题(无笔试&a…

python:并发编程(十八)

前言 本文将和大家一起探讨python并发编程的实际运用,会以一些我实际使用的案例,或者一些典型案例来分享。本文使用的案例是我实际使用的案例(下篇),是基于之前效率不高的代码改写成并发编程的。让我们来看看改造的过…

C++ 面向对象(1)——类 对象

C 在 C 语言的基础上增加了面向对象编程,C 支持面向对象程序设计。类是 C 的核心特性,通常被称为用户定义的类型。 类用于指定对象的形式,是一种用户自定义的数据类型,它是一种封装了数据和函数的组合。类中的数据称为成员变量&a…

videojs-player视频播放技术学习

介绍: videojs是一个开源的HTML5视频播放器,它可以在各种设备和浏览器上播放视频。videojs提供了丰富的API和插件,可以实现自定义的视频播放功能。 使用videojs实现视频播放的步骤: 1. 引入videojs库 在HTML文件中引入videojs库…

第40步 深度学习图像识别:DenseNet201建模(Tensorflow)

基于WIN10的64位系统演示 一、写在前面 (1)DenseNet201 DenseNet201是一种深度卷积神经网络,是DenseNet网络的一种变体。DenseNet,全称Dense Convolutional Network(密集卷积网络),是由Faceb…

【学习笔记】【UNR #3】百鸽笼

感觉自己对一些东西的理解还是不到位啊。 原问题可以转化成,有 n n n个数 { a i } \{a_i\} {ai​},每次从 n n n个数中随机选一个 i i i,令 a i max ⁡ ( a i − 1 , 0 ) a_i\max(a_i-1,0) ai​max(ai​−1,0),在期望有限步后 ∑…

Linux 多路转接 —— poll

目录 传统艺能😎poll🤣struct pollfd🤣 poll 服务器😘PollServer类😁运行服务器😒事件处理😁 服务器测试😂 传统艺能😎 小编是双非本科大二菜鸟不赘述,欢迎米…

W3B x Sui Hacker House|深入了解Sui和Move语言

Web3 Builders(W3B)作为Hacker House的践行者,将于6月23日(周五)早上8点(GMT8)举办首期 W3B x Sui Hacker House 系列活动分享会。本期活动邀请到Sui联合创始人Sam Blackshear(Move语…