装饰模式学习

news2025/1/21 2:53:19

背景

首先明确装饰模式是结构型设计模式的一种,但是结构型设计模式有什么特点呢。装饰模式的业务是给人穿衣服。

步骤

历史发展

版本1:只有一个Person类,这个类由三部分构成,本身的有参构造函数,给当前对象传不同衣服的几个方法,还有一个展示穿衣服客体名称的方法。

在这里插入图片描述

public class Person {
    String  name;
    public  Person (String  name){
        this.name = name;
    }


    public  void wearTshirt(){
        System.out.println("穿上大背心");
    }


    public  void wearTrousers(){
        System.out.println("穿上大裤子");
    }

    public  void   show(){
        System.out.println("展示的是"+this.name);
    }
}

public class Client {
    public static void main(String[] args) {
        Person  person  = new Person("小菜");
        person.wearTrousers();
        person.wearTshirt();
        person.show();
    }
}

在这里插入图片描述

缺点:
增加超人装扮需要修改代码,不符合开闭原则。

改变:抽象出来装扮类,通过增加子类的方式添加新的装扮。

版本2:抽象出来人类和服饰类,还有客户端。(人和服饰类之间没有直接的依赖关系)

在这里插入图片描述

public class Client {
    public static void main(String[] args) {
        Person person  = new Person("小菜");
        Finery tshirt = new Tshirt();
        Finery trousers = new Trousers();
        trousers.show();
        tshirt.show();
        person.show();
    }
}
public   abstract class Finery {
    abstract   void   show();
}

public class Person {
    String  name;
    public  Person (String  name){
        this.name = name;
    }

    public  void   show(){
        System.out.println("展示的是"+this.name);
    }
}

public class Trousers extends  Finery{
    
    void show() {
        System.out.println("穿上裤子");
    }
}
public class Tshirt extends  Finery{
    
    void show() {
        System.out.println("穿上大背心");
    }
}

展示结果:
在这里插入图片描述
缺点:客户端知道的太多了,整个穿衣服的过程完完全全展示在了客户端里边,能不能在内部组装完毕,然后展示出来。

改进:能不能把所需要的功能按照正确的顺序串联起来进行控制。

版本3:引入装饰模式

在这里插入图片描述

在这里插入图片描述

public class Client {
    public static void main(String[] args) {
        Person person  = new Person("小菜");
        InnerFinery  innerFinery = new InnerFinery();
        Finery tshirt = new Tshirt();
        Finery trousers = new Trousers();
       innerFinery.decorate(person);
       tshirt.decorate(innerFinery);
       trousers.decorate(tshirt);

        trousers.show();
    }
}

public    class Finery   extends Person {


    private Person  component;

    public void decorate (Person  component){
        this.component = component;
    }
    public    void   show(){
        if(component != null){
            component.show();
        }
    };
}

public class InnerFinery  extends Finery {

    public  void show(){
        System.out.println("穿内裤");
        super.show();
    }

}
public class Person {

    public Person(){};
    String  name;
    public  Person (String  name){
        this.name = name;
    }

    public  void   show(){
        System.out.println("展示的是"+this.name);
    }
}

public class Trousers extends Finery {
    
    public void show() {
        System.out.println("穿上裤子");
        super.show();
    }
}
public class Tshirt extends Finery {
    
    public void show() {
        System.out.println("穿上大背心");
        super.show();

    }
}

在这里插入图片描述

应用

装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。

在第三版代码中,这个对象是Person对象,额外的职责就是具体的装饰子类,但是person类并不知道Finery类。

放到我们的业务中就是主类不知道要附加类的存在,但是附加类知道主类的存在。

特点

装饰模式是为已有的功能动态添加更多功能的一种方式(这里是不是可以浅薄的理解为原来需要增加子类的那种都可以使用装饰模式实现呢)

和别的设计模式进行对比

这里可以和建造者模式进行类比,添加部件的顺序是在Decorator里边定义好的。但是装饰模式这里穿衣服的顺序是可以随时变化的,不适合直接写死在代码里边,所以基于当前这穿衣服的业务,不适合使用建造者和模板方法,模板方法里边也是将方法执行的步骤在源码就写好了。

总结

1、书上的超人是谁?是ConcreteComponent类的子类还是和这个类是同一层级的???

2、图上的聚合关系是如何进行体现的
3、哪里叫内部组装?
4、实现和使用分离式如何体现的呢???

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

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

相关文章

外包干了5个月,技术退步明显.......

先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

信创之国产浪潮电脑+统信UOS操作系统体验8:安装Docker并进行测试验证scratch镜像

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、前言 今日在进行Docker容器相关知识的学习,不过学习环境都不是基于统信UOS操作系统的,为了实验,老猿觉得手头国产浪潮电脑统信UOS操作系统就是原生的linux操作系统&a…

LiveData源码分析,粘性事件,数据倒灌

最近面试天天被虐,有个问题问的很频繁,就是 LiveData 的数据倒灌问题怎么解决。 我不知道有多少人连数据倒灌是什么都没听过的,更不要说什么解决方案啦。 我按照我的理解描述一下数据倒灌:就是设置了 LiveData 的数据之后&#…

“rhdf5filters.so’ not found when install ‘glmGamPoi‘ package

在R中安装glmGamPoi包的时候,出现了如下报错: install.packages(glmGamPoi) 尝试方案一: sudo apt install pkg-config libhdf5-dev安装lighdf5-dev,并将安装路径链接至usr/lib/文件。 locate rhdf5filters.so sudo ln -s /hom…

武汉建筑类初级职称助理工程师电子版证书申报

武汉建筑类初级职称助理工程师电子版证书申报 目前大家较为关注的是湖北省的助理工程师/初级职称评审出来之后是否可以网上查询。市面上还有一些地级市的区人社职改办出纸质版证书,职称证书、红头文件、评审表齐全,但是查询方式还是老一套的查询方式&am…

三勾商城新功能发布-多包裹订单

在不同场景下,商家可能需一笔订单需要分成多个包裹、分批发货,来看看怎么操作吧。 前端截图 后台截图 三勾小程序商城基于springbootelement-plusuniapp打造的面向开发的小程序商城,方便二次开发或直接使用,可发布到多端&#xf…

职场人最好的姿势是仰卧起坐

曾经看过一个回答说“职场人最好的姿势是仰卧起坐”。 卷累的就躺,休息好了再继续卷,卷是常态,“仰卧起坐”也好,“卷的姿势”也好,都是在反复“卷起”的过程中寻找一些舒适和平衡,“卷”得更持久罢了.....…

Linux 进程(一)

1 操作系统 概念:任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括 内核(进程管理,内存管理,文件管理,驱动管理) 其他程序(例…

LeetCode(41)单词规律【哈希表】【简单】

目录 1.题目2.答案3.提交结果截图 链接: 单词规律 1.题目 给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连…

Elasticsearch 快照如何工作?

作者:Lutf ur Rehman Elastic 提供许多由讲师指导的面对面和虚拟现场培训以及点播培训。 我们的旗舰课程是 Elasticsearch 工程师、Kibana 数据分析和 Elastic 可观测性工程师。 所有这些课程都会获得认证。有关这些课程的详细介绍,请参考我之前的文章 “…

20.Oracle11g中的触发器

oracle11g中的触发器 一、触发器的概述1、什么是触发器2、触发器的类型3、触发器的组成4、触发器的作用 二、触发器的创建语法1、创建语法2、数据库启动触发器3、 用户登录触发器: 三、对触发器的基本操作点击此处跳转下一节:21.Oracle的程序包(Package)…

QNX下多窗口叠加融合方案

目的:QNX下EGL多窗口叠加融合方案 环境: 系统:QNX 环境:8155/8295问题: EGL有时候在同一个进程中因为引入不同的功能,在不同的线程中进行窗口的绘制和融合,QNX下的融合方案,实测使…

夸克大模型助力学术科研提效 四大优势提升知识正确性

当严谨的学术科研与创新的大模型技术结合在一起,会擦出什么样的火花?日前,夸克大模型甫一推出便以优秀的性能成为国产大模型中的“学霸”。在中国科学技术协会近期主办的“大模型应用场景研讨会”上,夸克大模型在快速阅读、创作润…

求臻医学胃癌关爱日:美味的高“盐”值杀手

胃癌的发病率具有广泛的地域差异,在东南亚国家尤为高发。韩国是胃癌发病率排名第一的国家,其次为日本,中国紧随其后,由于中国人口基数大,其绝对患胃癌人数为全球第一,每年有100多万新诊断患者,其…

nvm for windows使用与node/npm/yarn的配置

1 下载 nvm for windows download – github 下拉到Assets, 下载.exe文件 2 安装 安装到如下文件夹中 目录可以自己选, 可以换别的名字, 自己记住即可 新手建议全部看完再进行个人配置, 或者使用与博主一致的路径 D:\DevelopEnvironment\nvm3 配置nvm使用的镜像 node_mir…

wvp 视频监控平台抓包分析

抓包时机 下面的抓包时机是抓包文件最新,但是最有用的包 选择网卡开始抓包 如果之前已经选择网卡,直接开始抓包 停止抓包 重新抓包 sip播放过程分析 过滤条件 tcp.port 5060 and sip 可以看到有这些包 选择任何一个 ,戍边右键--追踪流--…

Maven——使用Nexus创建私服

私服不是Maven的核心概念,它仅仅是一种衍生出来的特殊的Maven仓库。通过建立自己的私服,就可以降低中央仓库负荷、节省外网带宽、加速Maven构建、自己部署构件等,从而高效地使用Maven。 有三种专门的Maven仓库管理软件可以用来帮助大家建立…

【C++】异常处理 ① ( 异常概念引入 | 抛出异常语法 | 捕获异常语法 | 异常捕获流程 | 异常处理代码示例 )

文章目录 一、异常处理1、异常概念引入2、抛出异常语法3、捕获异常语法4、异常捕获流程 二、异常处理代码示例1、错误代码示例 - 抛出异常 / 不捕获异常2、正确代码示例 - 抛出异常 / 捕获异常3、正确代码示例 - 抛出异常 / 捕获异常不处理继续抛出异常 一、异常处理 1、异常概…

【导航控制器的基本使用 Objective-C语言】

一、导航控制器的基本使用 1.那接下来呢,我们就要讲解这个重中之重了啊,导航控制器,大家一定要注意听,那首先呢,我们先来看ppt,引导一下, 导航控制器.pptx,打开, 那接下来呢,我们就要学习这个多控制器的管理了, 里面的第一个内容,叫做导航控制器, 那今天呢,我们…

unity学习笔记08

一、预制体 在Unity中,预制体(Prefab)是一种特殊类型的游戏对象,它允许你创建、配置和保存一个对象,然后在场景中多次使用。预制体的使用使得开发者能够更加灵活和高效地设计和管理游戏对象。 1.创建预制体 可以选择…