首页 > 其他分享 >23种设计模式之装饰模式

23种设计模式之装饰模式

时间:2024-05-31 15:00:33浏览次数:17  
标签:eat 23 void 装饰 Person 构件 设计模式 public

装饰模式

1、定义

装饰模式:动态的给一个对象增加一些额外的职责。就扩展功能而言,装饰模式提供了一种比使用子类更加灵活的替代方案。

2、装饰模式结构

  • Component(抽象构建):它是具体构建和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法。
  • ConcreteComponent(具体构建):定义具体的构件对象,实现了在抽象构件中声明的方法,装饰类可以给他增加额外的职责(方法)。
  • Decorator(抽象装饰类):它也是抽象构件类的子类,用于给具体构件增加职责,但是具体职责在其子类中实现。它维护一个指向抽象构件对象的引用,通过该引用可以调用装饰之前构件对象的方法,并通过子类扩展该方法,以达到装饰的目的。
  • ConcreteDecorator(具体装饰类):负责向构件添加新的职责。每一个具体装饰类都定义了一些新的行为,它可以调用在抽象装饰类中定义的方法,并可以增加新的方法用于扩展对象的行为

装饰模式结构图

3、实例代码

Component 创建Person

public interface Person {
    void eat();
}

ConcreteComponent 创建Man实现Person接口

public class Man implements Person {
    @Override
    public void eat() {
        System.out.println("这个人在吃饭");
    }
}

Decorator

public abstract class Decorator implements Person {

    protected Person person;

    public void setPerson(Person person) {
        this.person = person;
    }

    @Override
    public void eat() {
        person.eat();
    }
}

ConcreteDecorator

public class ManDecoratorA extends Decorator {

    @Override
    public void eat() {
        super.eat();
        reEat();
        System.out.println("ManDecoratorA类");
    }
    public void reEat() {
        System.out.println("再吃一顿饭");
    }
}
public class ManDecoratorB extends Decorator {

    @Override
    public void eat() {
        super.eat();
        System.out.println("===============");
        System.out.println("ManDecoratorB类");
    }
}

新建测试类

public class Client {

    public static void main(String[] args) {
        Man man = new Man();
        ManDecoratorA md1 = new ManDecoratorA();
        ManDecoratorB md2 = new ManDecoratorB();

        md1.setPerson(man);
        md2.setPerson(md1);
        md2.eat();
    }
}

4、装饰模式优缺点

4.1优点
  • 对于扩展一个对象的功能,装饰模式比继承更加灵活
  • 可以对一个对象进行多次装饰,通过使用不同的具体装饰类以及这些装饰类的排列组合可以创造出很多不同行为的组合,得到功能更加强大的对象
  • 具体构件类和具体装饰类可以独立变化,用户根据具体需求增加新的具体构件类和具体装饰类,符合开闭原则
4.2缺点
  • 使用装饰模式会产生很多小对象,占用更多的系统资源,在一定程度上影响程序的性能
  • 对于多次装饰的对象,在调试时寻找错误可能需要逐级排查,较为繁琐

5、装饰模式适用环境

  • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
  • 处理那些可以撤消的职责。
  • 当不能采用生成子类的方法进行扩充时。

标签:eat,23,void,装饰,Person,构件,设计模式,public
From: https://blog.csdn.net/qq_38811830/article/details/139336959

相关文章

  • 墨天轮《2023年中国数据库行业年度分析报告》正式发布!
    为明晰发展脉络,把握未来趋势,墨天轮于5月29日正式发布 《2023年中国数据库年度行业分析报告》。该报告由墨天轮联合业界专家学者共同编写,共330页,旨在梳理和洞察中国数据库行业的发展趋势、技术创新、市场动态以及面临的挑战,为数据库行业的产学研用提供有价值的参考信息,推动行业的......
  • 设计模式:全网最全(23+10种)、最易懂(对比代码)、最简洁(三言两语)、最深度(带点评)的
    前言设计模式是软件开发中的重要工具,灵活掌握大量的设计模式,能够帮助我们编写更灵活、可维护和可扩展的代码。网上有许多关于设计模式的文章,往往把设计模式介绍得高深莫测,墨守成规。于是,不久前萌发了写一篇简单易懂的设计模式介绍的文章的想法。在开始之前,我想强调切勿滥......
  • Centos8安装k8s1.23.9
    离线安装一、环境准备卸载podman关闭交换区禁用selinux关闭防火墙依赖包安装系统参数优化配置本地dockeryum源一:centos8默认安装podmanbuildah需要卸载sudoyumerasepodmanbuildah-y二:节点关闭swap分区swapoff-a&&sysctl-wvm.swappiness=0sudosed-i'......
  • Centos7部署k8s1.23.9
    !/bin/bashfunctionnode_update_kernel(){启用ELRepo仓库sudorpm--importhttps://www.elrepo.org/RPM-GPG-KEY-elrepo.orgsudorpm-Uvhhttp://www.elrepo.org/elrepo-release-7.0-6.el7.elrepo.noarch.rpm查看可用的系统内核包sudoyum--disablerepo="*"--enabl......
  • 麒麟kylin安装K8s1.23.9
    1.主机名解析10.129.148.4hangkong-k8s-node0110.129.148.5hangkong-k8s-node0210.129.148.6hangkong-k8s-node0310.129.148.4hangkong-k8s.vip.com2.主机名设置echo'hangkong-k8s-node01'>/etc/hostnameecho'hangkong-k8s-node02'>/etc/hos......
  • 麒麟kylin-ARM安装K8s1.23.9
    第一章k8s及中间件安装1.主机名解析2.主机名设置3.禁用iptables和firewalld4.禁用selinux(linux下的一个安全服务,必须禁用)5.禁用swap分区(主要是注释最后一行)6.修改系统的内核参数7.配置ipvs功能8.安装docker验证docker安装是否成功9.安装kubernetes1.23.910.集群初始......
  • Leetcode 力扣106. 从中序与后序遍历序列构造二叉树 (抖音号:708231408)
    给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。示例1:输入:inorder=[9,3,15,20,7],postorder=[9,15,7,20,3]输出:[3,9,20,null,null,15,7]示例2:输入:inorder=[......
  • Leetcode 力扣105. 从前序与中序遍历序列构造二叉树 (抖音号:708231408)
    给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。示例1:输入:preorder=[3,9,20,15,7],inorder=[9,3,15,20,7]输出:[3,9,20,null,null,15,7]示例2:输入:preorder......
  • 只更新装饰视图
    我计划在我的集合视图的某个位置添加一个视图。因此,我想使用装饰视图。现在,该位置应每分钟更改一次。如何在iOS7和iOS8上使用UICollectionView实现这一目标?似乎可以通过invalidateLayoutWithContext来实现这一目标,但是是否可以在一个布局中使用多个UICollectionView......
  • 设计模式——单例模式
    一。引言当我们写一个体量比较大的代码使,如果这是堆积罗列,那么会发现有许多冗余的情况,并且还不利于团队共同协作,代码难以定位。于是为了解决这些问题,提高代码的可读性,减少耦合度,我们引入了设计模式。设计模式就像盖房子时的图纸,根据这些图纸的指导可以让我们把房子建的更漂......