首页 > 其他分享 >学习记录-装饰器模式

学习记录-装饰器模式

时间:2023-01-11 20:22:13浏览次数:49  
标签:功能 记录 机器人 扩展 模式 public 装饰

装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

补充知识点:什么是方法的签名

方法的签名:由方法的名称形参列表组成,具体来说,一个方法的签名由它的名称以及它的形参的个数修饰符和类型组成。

介绍

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

主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,这种方式是静态的,一定要写一个新的子类,对类层级进行扩展,并且随着扩展功能的增多,子类会很膨胀。

何时使用:在不想增加很多子类的情况下扩展类。

如何解决:将具体功能职责划分,同时继承装饰者模式。

关键代码: 1、Component 类充当抽象角色,不应该具体实现。 2、修饰类引用和继承 Component 类,具体扩展类重写父类方法。

应用实例: 1、孙悟空有 72 变,当他变成"庙宇"后,他的根本还是一只猴子,但是他又有了庙宇的功能。 2、不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体。

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:多层装饰比较复杂。

使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。

注意事项:可代替继承。

实现

例子

image-20230111200437249

现在有一个机器人,它有对话、唱歌、放音乐的功能,但是由于买家的需求,现在需要对机器人功能进行扩展,要求机器人除了原本的功能还需要有拖地、跳舞的功能。

现在有两种解决方案。

第一种方案:在第一代产品的基础上,重新研制第二代产品。即继承机制,就是继承一个现有的类,在子类进行扩展功能。

第二种方案:直接对第一代产品进行升级改造,不再另外生成新一代机器人。即关联机制,把一个类的对象嵌入到另一个类的对象中(我们拿到一个类就可以对其进行扩展,不需要修改原有类逻辑),相对于把机器人嵌入到箱子里来,给他套一个壳子,来扩展功能,那个壳子呢,就是我们所说的装饰器。这种方式呢,也称为装饰器模式。

类图

image-20230111195910349

代码实现

public class Main {
    public static void main(String[] args) {
        //这种书写方式是不是很熟悉,我们在用IO流的经常使用
        //没错,Java的IO流也大量使用了装饰器模式
        new RobotDecorator(new FirstRobot()).doMoreThing();
    }

    /*步骤一
    首先呢,我们定义一个接口,它代表了那些需要被修饰的对象,这个接口我们叫机器人接口
     */
    interface Robot{
        void doSomeThing();
    }

    /*步骤二
    实现第一代机器人
    注:这里static修饰知识因为在main函数里调用了相关函数,并无其它意义。
    */
    static class FirstRobot implements Robot{

        @Override
        public void doSomeThing() {
            System.out.println("对话");
            System.out.println("唱歌");
            System.out.println("放音乐");
        }
    }

    /*步骤三
    定义一个装饰器来对第一代机器人功能扩展,它需要实现和机器人一样的接口。
    即它装饰的那个对象的功能它也要有。
    注:这里static修饰知识因为在main函数里调用了相关函数,并无其它意义。
    */
    /*在这里我们可以定义为抽象类,这样可以定义其子类去实现更多的装饰器(更灵活)*/
    static class RobotDecorator implements Robot{
        /*首先呢,我们需要定义一个字段,因为我们要关联使用机器人,所以我们来定义一个机器人字段*/
        private Robot robot;

        /*接着呢,要传这个对象进来,用构造方法去传*/
        public RobotDecorator(Robot robot){
            this.robot=robot;
        }

        /*接着呢,我们去实现机器人该有的方法*/
        @Override
        public void doSomeThing() {
            /*这里呢,我们直接让机器人去做就行了*/
            robot.doSomeThing();
        }

        /*扩展功能,它可以做原有的功能,也可以做新的功能*/
        public void doMoreThing(){
            robot.doSomeThing();
            System.out.println("跳舞、拖地");
        }
    }
}

运行结果

对话
唱歌
放音乐
跳舞、拖地

此文章参考:

【菜鸟教程】:https://www.runoob.com/design-pattern/decorator-pattern.html

【五分钟学设计模式.05.装饰器模式-哔哩哔哩】: https://b23.tv/zwp3Rob

标签:功能,记录,机器人,扩展,模式,public,装饰
From: https://www.cnblogs.com/galo/p/17044801.html

相关文章

  • 【编程】大端小端模式
    一句话:低位的数据保存到高位上,就是装大尾巴狼,就是大端。 数据:11223344(尾端是44)保存在寄存器:(左边是高地址)44332211  (右边是低地址) --大端保存在寄存器:(左边是高地址......
  • 网络流 24 题做题记录
    网络流24题做题记录P3254圆桌问题源点连单位,容量为单位人数,桌子连汇点,容量为桌子容量,各单位连各桌子,容量为\(1\),因为每个单位在每张桌子上最多\(1\)人,跑最大流。P......
  • buuctf-preg_replace的e模式造成命令执行
    [BJDCTF2020]ZJCTF,不过如此打开后是正常的代码审计首先第一眼看到的就是file_get_contents而且还对$text有要求,直接上伪协议data://text/plain,Ihaveadream,同时按照......
  • linux一次安装chromedrive记录
    先查看已安装的chrome版本[root@iZ8vbeixmmd1ntxae9oe19Z~]#google-chrome--versionGoogleChrome109.0.5414.74[root@iZ8vbeixmmd1ntxae9oe19Z~]#没有安装需......
  • JavaScript严格模式(use strict)
    一、什么是严格模式(strictmode)JavaScript严格模式即在严格模式下运行。严格模式下,你将不能使用未声明的变量。注意,严格模式需要浏览器的支持:Internetexplorer10+、Fire......
  • RDD如何分区,各种模式下的分区数目是怎样的?
    在分布式程序中,网络通信的开销是很大的,因此控制数据分布以获得最少的网络传输开销可以极大地提升整体性能.​​Spark​​程序可以通过控制RDD分区方式来减少通信开销。Spar......
  • cmake常用函数记录
    由于cmake我一般是项目移植的时候,才会涉及到,一些常用函数隔一段时间就会忘记,所以在此做一下笔记,以便日后查看。1、添加链接库所在的目录: link_directories("./libs")......
  • Android之Activity的启动模式
    在Android中,Activity的启动模式有5种,我们大多数开发中,很少根据具体的场景去设定Activity的启动模式,其实理解了启动模式,可以在解决某些场景问题的时候,让我们更简单的去解决......
  • MSSQL中开启CDC导致事务日志空间被占满事件记录
    问题描述SQLServer中开启CDC之后,在某些情况下会导致事务日志空间被占满的现象为:在执行增删改语句(产生事务日志)的过程中提示,Thetransactionlogfordatabase'***'isfu......
  • 未来软件开发主流模式——低代码开发
    低代码平台起始于20世纪80年代4GL“第四代编程语言”。2014年,Forresterresearch提出低代码平台的概念,中国低代码市场进入发展期;2018年,西门子收购低代码企业Mendix、美国低......