首页 > 其他分享 >装饰器模式(Decorator)

装饰器模式(Decorator)

时间:2024-05-28 14:11:06浏览次数:21  
标签:角色 component 模式 public 抽象 构件 装饰 Decorator

装饰器模式(Decorator Pattern)

是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责(即增加其功能),就增加功能来说,装饰器模式相比生成子类更为灵活。装饰器模式是一种对象结构型模式,在其结构图中含有一个作为抽象构件(Component)角色的接口和多个实现了该接口的抽象装饰类(Decorator)角色。抽象装饰类给原有业务类添加职责(方法或者属性),并且含有指向抽象构件角色的引用。

模式结构

装饰器模式主要包含以下角色:

  1. 抽象构件(Component)角色:它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法,它的引入可以使客户端以一致的方式处理未被装饰的对象以及装饰之后的对象,实现客户端的透明操作。
  2. 具体构件(ConcreteComponent)角色:它是抽象构件角色的子类,用于定义具体的构件对象,实现了在抽象构件中声明的方法,装饰器可以为它增加额外的职责(方法)。
  3. 抽象装饰(Decorator)角色:它也是抽象构件角色的子类,用于给具体构件增加职责,但是具体职责在抽象装饰中并不实现。它维护一个指向抽象构件角色的引用,在抽象装饰角色的子类中可以通过该引用来调用装饰之前构件对象的方法,并通过其子类扩展该方法,以达到增加或增强功能的目的。
  4. 具体装饰(ConcreteDecorator)角色:它是抽象装饰角色的子类,负责向构件添加新的职责。每一个具体装饰类都添加了一些额外的职责,同时它记住并包含它的所装饰的对象的引用。

工作原理

装饰器模式的工作原理是动态地将责任附加到对象上。若要扩展一个对象的功能,装饰器提供了一个比继承更有弹性的替代方案。装饰器模式通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。

优点

  1. 透明性:客户端可以一致地使用构件对象,而无需关心它是否被装饰过,以及被装饰了多少次。
  2. 灵活性:通过灵活使用不同的装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。
  3. 扩展性:如果需要添加新的功能,只需要增加一个新的具体装饰类即可,无需修改原有代码。

缺点

  • 多层装饰比较复杂:如果多层装饰的话,会导致系统设计中出现许多小类,这些类的区别只在于它们之间相互连接的方式有所不同。
  • 可能会增加性能开销:因为每次添加装饰时,都需要创建一个新的装饰对象,并存储其引用,这可能会增加一些性能开销。

示例代码(Java)

以下是一个简单的装饰器模式的示例代码:

java
// 抽象构件角色  
interface Component {  
    void operation();  
}  
  
// 具体构件角色  
class ConcreteComponent implements Component {  
    @Override  
    public void operation() {  
        System.out.println("执行具体构件角色的操作");  
    }  
}  
  
// 抽象装饰角色  
abstract class Decorator implements Component {  
    protected Component component;  
  
    public Decorator(Component component) {  
        this.component = component;  
    }  
  
    @Override  
    public void operation() {  
        if (component != null) {  
            component.operation();  
        }  
    }  
}  
  
// 具体装饰角色  
class ConcreteDecoratorA extends Decorator {  
    public ConcreteDecoratorA(Component component) {  
        super(component);  
    }  
  
    @Override  
    public void operation() {  
        super.operation();  
        addedFunctionA();  
    }  
  
    public void addedFunctionA() {  
        System.out.println("为构件对象添加功能A");  
    }  
}  
  
// 另一个具体装饰角色  
class ConcreteDecoratorB extends Decorator {  
    public ConcreteDecoratorB(Component component) {  
        super(component);  
    }  
  
    @Override  
    public void operation() {  
        super.operation();  
        addedFunctionB();  
    }  
  
    public void addedFunctionB() {  
        System.out.println("为构件对象添加功能B");  
    }  
}  
  
// 客户端代码  
public class Client {  
    public static void main(String[] args) {  
        Component component = new ConcreteComponent();  
  
        // 使用装饰器A  
        ConcreteDecoratorA decoratorA = new ConcreteDecoratorA(component);  
        decoratorA.operation();  
  
        // 使用装饰器B  
        ConcreteDecoratorB decoratorB = new ConcreteDecoratorB(decoratorA);  
        decoratorB.operation();  
    }  
}

标签:角色,component,模式,public,抽象,构件,装饰,Decorator
From: https://www.cnblogs.com/zjjtt/p/18217890

相关文章

  • 设计模式概要
    常见的5中设计模式1.但通常所说的“23种设计模式”是指那些在实践中被广泛认可和使用的设计模式。这些设计模式可以分为以下三类:创建型模式(CreationalPatterns):用于处理对象的创建机制,以提高系统的灵活性和可重用性。单例模式(Singleton):确保一个类只有一个实例,并提供一个全局......
  • 设计模式大纲
    设计模式大纲设计模式(DesignPattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式可以提高代码的可读性、可扩展性、可靠性和可测试性。设计模式是软件工程中常用的一种软件设计原则,它是一套被反复使用、多数人知晓的、经过分类的、代码设计......
  • 第一章 设计模式、UML图、软件设计原则
    本系列博客主要参考黑马程序员的Java设计模式详解视频教程1.设计模式概述1.1软件设计模式的概念软件设计模式(SoftwareDesignPattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生......
  • nginx 配置 vue History模式
    解决需要加一行try_files$uri$uri//index.html;,其中/index.html是你自己的目录中的入口文件server{listen[::]:80default_server;#root/var/www/html;#Addindex.phptothelistifyouareusingPHPindexindex.htmlindex......
  • 构建未来|进击的元宇宙模式,打破线上线下界限
     元宇宙是指由虚拟世界、数字孪生和现实世界三个核心元素构成的综合体,具有高度沉浸和交互性,可以提供更为广泛和多样化的虚拟体验,并在现实中影响和塑造人们的生活。如今,随着科技不断发展,VR/AR、区块链、AI等众多技术的逐个成熟,元宇宙开始与现实世界紧密融合,元宇宙开发是指在元......
  • python closure, first-class function, decorator
    闭包:closurefunctionhtml_tag(tag){ functionwrap_text(msg){  console.log('<'+tag+'>'+msg+'</'+tag+'>') } returnwrap_text}print_h1=html_tag('h1')print_h1('TestHea......
  • 第五章 并发基础中的Future异步回调模式
    案例:为了提升泡茶效率。下面分别是用阻塞模式和异步回调模式来实现其中的异步泡茶流程。为了异步执行整个泡茶流程,分别设计三条线程:主线程、清洗线程、烧水线程。(1)主线程(MainThread)的工作是:启动清洗线程、启动烧水线程,等清洗、烧水完成后,泡茶喝。(2)清洗线程(WashThread)的工作是:洗......
  • WPF之单例模式
    项目2019/10/09 问题2019年10月9日星期三上午2:461、为了实现单例模式,在App类中添加了如下代码,使用了信号量,但是为什么返回;isNew一直为truepublicpartialclassApp:Application   {       protectedoverridevoidOnStartup(StartupEventArgs......
  • “胖东来”超市商业模式,为何被誉为中国零售业是神一般的存在?
    “胖东来”超市商业模式,为何被誉为中国零售业是神一般的存在?文丨微三云营销总监胡佳东,点击上方“关注”,为你分享市场商业模式电商干货。-胖东来是中国商超界的天花板,被小米老板雷军:誉为“中国零售业是神一般的存在”,2023年的销售收入甚至超100亿元,引无数商超企业、超市老板......
  • 第七十五节 Java设计模式 - 模板方法模式
    Java设计模式-模板方法模式在模板模式中,父抽象类公开几个抽象方法供子类实现。在父抽象类中有另一个方法或几个方法使用抽象方法来实现业务逻辑。抽象方法通常用于父类所需的每个步骤。例如,为了使用新的软件,我们需要下载,安装,配置和运行。如果我们要使用模板模式来编码逻......