【再探】设计模式—适配器、装饰及外观模式

news2024/11/24 7:41:00

 结构型设计模式是用于设计对象和类之间关系的一组设计模式。一共有7种:适配器模式、装饰器模式、外观模式、桥接模式、组合模式、享元模式及代理模式。

1 适配器模式

需求:在软件维护阶段,已存在的方法与目标接口不匹配,需要个中间类来适配这个方法。

1.1 适配器模式介绍

将一个类的接口转换成客户端期望的目标类格式,使得原本不兼容的类可以一起工作。

图 适配器模式 UML

public class AdapterPattern {

    public static void main(String[] args) {
        SimpleEncrypt simpleEncrypt = new SimpleEncrypt();
        EncryptAdapter adapter = new EncryptAdapter(simpleEncrypt);
        String encrypt = adapter.encrypt("hello adapter");
        System.out.println(encrypt);
    }

    private interface Encrypt {
        String encrypt(String text);
    }

    private static class EncryptAdapter implements Encrypt{

        private static final int ENCRYPT_LENGTH = 15;

        private final SimpleEncrypt simpleEncrypt;

        private EncryptAdapter(SimpleEncrypt simpleEncrypt) {
            this.simpleEncrypt = simpleEncrypt;
        }

        @Override
        public String encrypt(String text) {
            return simpleEncrypt.encrypt(text,ENCRYPT_LENGTH);
        }

    }

    private static class SimpleEncrypt {
        public String encrypt(String text,int length) {
            return text + length;
        }
    }

}

对象适配器

在适配类中关联一共被适配者对象,通过调用被适配者对象的方法来实现适配。

类适配器

实现目标接口的同时,继承被适配者类。

接口适配器

通过一个抽象类来实现接口中的所有方法。具体类通过继承抽象类,根据需求只需要重写特定的方法。

表 适配器种类

1.2 优缺点

优点:

  1. 提高代码的复用性,让原本不兼容的类可以协同工作。
  2. 降低系统耦合度,客户端只与适配器进行交互。

缺点:

  1. 过度使用适配器可能导致系统变得复杂,难以理解和维护,也可能导致性能下降。

2 装饰模式

需求:1)想给给类添加新的功能。而不希望使用继承的方式。2)动态添加及撤销功能。

2.1 装饰模式介绍

在不改变一个对象的接口的前提下,通过创建一个装饰者来包裹真实对象,来动态地增加额外的职责到该对象

图 装饰模式 UML

完全透明

装饰对象和原始对象具有相同的接口,客户端不需要区分装饰对象及原始对象。

半透明

允许装饰对象的接口与原始对象的接口不完全一致。装饰对象的接口可能会比原始对象更宽,但仍需要实现原始对象的接口。

表 装饰模式的两种模式

public class DecoratorPattern {

    public static void main(String[] args) {
        String text = "hello decorator";
        Verifier noEmptyVerifier = new NoEmptyVerifier();
        Verifier minLengthVerifier = new MinLengthVerifier(noEmptyVerifier,7);
        System.out.println(minLengthVerifier.verification(text));
    }

    private interface Verifier {
        boolean verification(String text);
    }

    private static class NoEmptyVerifier implements Verifier {

        @Override
        public boolean verification(String text) {
            return text != null && text.trim().length() > 0;
        }
    }

    private static class MinLengthVerifier implements Verifier {

        private final int DEFAULT_MIN_LENGTH = 15;

        private final Verifier verifier;
        private int minLength = DEFAULT_MIN_LENGTH;

        private MinLengthVerifier(Verifier verifier) {
            this.verifier = verifier;
        }

        public MinLengthVerifier(Verifier verifier, int minLength) {
            this.verifier = verifier;
            this.minLength = minLength;
        }

        @Override
        public boolean verification(String text) {
            return verifier.verification(text) && text.length() > minLength;
        }
    }

}

2.2 优缺点

优点:

  1. 提供了比继承更多的灵活性。
  2. 可以创建一个功能更加强大的对象,通过对一个对象进行多次装饰。
  3. 可以动态的添加及撤销功能。

缺点:

  1. 会产生很多小对象,如果过度使用,可能会导致程序变得复杂且难以维护。
  2. 在某些情况下,调试和排查问题的难度增加。

3 外观模式

需求:与系统交互时,不想与系统的其他业务模块产生关联,希望与一个统一的角色进行交互。

3.1 外观模式介绍

客户端与系统的通信通过一个统一的外观角色进行。

图 外观模式 UML

public class FacadePattern {

    public static void main(String[] args) { // 客户端
        SystemController controller = SystemController.getInstance();
        System.out.println(controller.getUser("facade"));
    }

    private static class SystemController { // 对外的接口

        private static volatile SystemController instance;

        public static SystemController getInstance() {
            if (instance == null) {
                synchronized (SystemController.class) {
                    if (instance == null) {
                        UserService service = new UserService(new UserMapper());
                        instance = new SystemController(service);
                    }
                }
            }
            return instance;
        }

        private final UserService userService;

        private SystemController(UserService userService) {
            this.userService = userService;
        }

        public String getUser(String username) {
            return userService.getUser(username);
        }
    }

    private static class UserService {
        private final UserMapper userMapper;

        private UserService(UserMapper userMapper) {
            this.userMapper = userMapper;
        }

        public String getUser(String username) {
            if (username == null) return "";
            return userMapper.searcherByUsername(username);
        }

    }

    private static class UserMapper {
        public String searcherByUsername(String username) {
            return "用户+" + username;
        }
    }

}

3.2 优缺点

优点:

1)将客户端与系统内部模块分隔开,符合迪米特法则,降低了耦合度。

缺点:

1)不符合开闭原则。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1649366.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态内存开辟(下)

前言 动态内存开辟以及柔性数组的介绍 一、 几个经典的笔试题 1. 题目一 void Getmemory(char*p) {p (char*)malloc(100); } int main() {char* str NULL;Getmemory(str);strcpy(str, "hello world");printf(str);return 0; } 这段代码我们可以发现两个很明显…

看完这篇文章我奶奶都懂Opentracing了 (二)

二. 概念分析 1. Span和SpanContext 结合上述示例,我们从Span开始入手来进行概念分析,但是说在最前面,Span在不同的分布式链路实现中,其定义是不全一样的,尽管Opentracing已经进行了概念的统一,但是具体到…

基于FPGA的数字锁控制电路VHDL代码Quartus仿真

名称:基于FPGA的数字锁控制电路VHDL代码Quartus仿真(文末获取) 软件:Quartus 语言:VHDL 代码功能: 任务及要求 硬件描述语言VHDL是一种用形式化方法描述数字电路和系统的语言。利用这种语 ,数字电路系统的设计可…

使用 GPT-4-turbo+Streamlit+wiki+calculator构建Math Agents应用【Step by Step】

💖 Brief:大家好,我是Zeeland。Tags: 大模型创业、LangChain Top Contributor、算法工程师、Promptulate founder、Python开发者。📝 CSDN主页:Zeeland🔥📣 个人说明书:Zeeland&…

Linux cmake 初窥【2】

1.开发背景 基于上一篇的基础上,再次升级 2.开发需求 基于 cmake 指定源文件目录可以是多个文件夹,多层目录 3.开发环境 ubuntu 20.04 cmake-3.23.1 4.实现步骤 4.1 准备源码文件 工程目录如下 顶层脚本 compile.sh 负责执行 cmake 操作&#xff0…

GNU Radio FFT模块结合stream to vector应用及Rotator频偏模块使用

文章目录 前言一、FFT 模块应用1、stream to vector 介绍2、创建 grc 图测试3、运行结果 二、频偏模块1、Rotator 简介2、创建 grc 图测试3、运行结果 前言 写个博客记录一下自己的蠢劲儿,之前我想用 FFT 模块做一些信号分析的东西,官方的 FFT 模块必须…

redux的简单用法

1.安装包 npm install reduxjs/toolkit react-redux -S 2.看看目录结构 3.store的user代码 import { createSlice } from "reduxjs/toolkit";// 初始状态 let initialState {count: 1,users: [{name: "zhangzhang",pass: "123456",},],infor…

CSS中文本样式(详解网页文本样式)

目录 一、Text介绍 1.概念 2.特点 3.用法 4.应用 二、Text语法 1.文本格式 2.文本颜色 3.文本的对齐方式 4.文本修饰 5.文本转换 6.文本缩进 7.color:设置文本颜色。 8.font-family:设置字体系列。 9.font-size:设置字体大小。…

劝退计算机?CS再过几年会没落!?

事实上,未来计算机不仅不会没落,国家还会大力发展 只不过大家认为的计算机就是什么Java web,真正的计算机行业是老美那样的,涉及到方方面面,比如: web,图形学,Linux系统开发&#…

【第11章】spring-mvc默认转换器

文章目录 前言一、DateFormatter二、NumberFormat1. NumberBean2. number.jsp 三、ConverterController四、执行结果总结 前言 【第6章】spring类型转换器 此章节内容为spring类型转换器内容扩展,使用spring提供的注解增强转换器功能,让date和int等类型转换更加方便。 一、Da…

利用生成式AI重新构想ITSM的未来

对注入 AI 的生成式 ITSM 的需求,在 2023 年 Gartner AI 炒作周期中,生成式 AI 达到预期值达到顶峰后,三分之二的企业已经将生成式 AI 集成到其流程中。 你问为什么这种追求?在预定义算法的驱动下,IT 服务交付和管理中…

PM说|还有不会DISC的项目经理?

DISC行为模型是一种常用于职场中的人际交往工具,它通过对个体的行为特点进行分类和分析,帮助人们更好地理解自己和他人的行为方式,从而更加高效地进行沟通和合作。在项目管理过程中,多方沟通是必备工作技能,如何利用DI…

CP AUTOSAR之CANXLDriver详细说明(正在更新中)

本文遵循autosar标准:R22-11 1 简介及功能概述 本规范描述了AUTOSAR 基础软件模块CAN XL 驱动程序的功能、API和配置。   本文档的基础是[1,CiA610-1]和[2,CiA611-1]。假设读者熟悉这些规范。本文档不会再次描述CAN XL 功能。   CAN XL 驱动程序是最低层的一部…

基于TF的简易关键字语音识别

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计10182字,阅读大概需要10分钟 🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号&#…

淤地坝安全监测预警系统解决方案

一、方案背景 淤地坝是黄土高原地区人民群众长期同水土流失斗争实践中创造的一种行之有效的水土保持工程措施,在拦泥保土、减少入黄泥沙、防洪减灾、淤地造田、巩固退耕还林(草)、保障生态安全、促进粮食生产和水资源合理利用及经济社会稳定发…

自动驾驶学习1-超声波雷达

1、简介 超声波雷达:利用超声波测算距离的雷达传感器装置,通过发射、接收 40kHz、48kHz或 58kHz 频率的超声波,根据时间差测算出障碍物距离,当距离过近时触发报警装置发出警报声以提醒司机。 超声波:人耳所不能听到的…

HG-KN73J-S100 三菱伺服电机(750W型)

HG-KN73J-S100属于三菱MR-JE系列伺服系统,可以与伺服驱动器MR-JE-70A、MR-JE-70B、MR-JE-70C配套使用。HG-KN73J-S100完全替换HF-KN73J-S100。HG-KN73J-S100规格、HG-KN73J-S100参数。 HG-KN73J-S100参数说明:MR-JE低惯性/小容量、0.75Kw三菱伺服电机HG-…

Web实操(6),基础知识学习(24~)

1.[ZJCTF 2019]NiZhuanSiWei1 (1)进入环境后看到一篇php代码,开始我简单的以为是一题常规的php伪协议,多次试错后发现它并没有那么简单,它包含了基础的文件包含,伪协议还有反序列化 (2&#x…

uniapp文本框上下滚动问题

一个基本需求,textarea标签没有办法通过手拖动的方式进行滚动,当文字超出其容量后,想要编辑上面被遮挡部分的文字这边难以点到,电脑可以鼠标滚轮,但手机需要拖动但无效: 下面提供了我的解决思路&#xff1a…

IP规划案例

整个OSPF环境IP基于172.16.0.0/16划分 172.16.0.0/16 先分成2个网段(OSPF RIP),借1位172.16.0.0/17 ---OSPF 再按区域划分(5个区域),借3位 172.16.0.0/20 ---Area 0 三个环回 MGRE 4个网…