首页 > 其他分享 >重温设计模式 --- 装饰器模式

重温设计模式 --- 装饰器模式

时间:2023-07-10 22:36:23浏览次数:34  
标签:IComponent component 重温 public --- 对象 Operation 设计模式 装饰

引言

装饰器模式是一种结构型设计模式,它允许在不改变原始对象的情况下,通过将其包装在一个装饰器对象中,来动态地添加额外的功能。

装饰器模式的核心思想是,将一个对象放在另一个对象的外面,以给原始对象添加新的行为。这个“另一个对象”就是装饰器(Decorator),它持有一个原始对象(Component)的引用,并实现与原始对象相同的接口。装饰器可以通过调用原始对象的方法,来执行自己的行为。这种方式可以动态地添加、删除或替换对象的行为,而不需要修改原始对象的代码。

基本类接口

定义一个基本对象接口或抽象类,称为Component,它定义了一些基本操作:

//定义基本对象接口
public interface IComponent
{
    void Operation();
}

基本类实现

定义一个实现IComponent接口的具体类:

//IComponent接口的实现类
public class ConcreteComponent : IComponent
{
    public void Operation()
    {
        Console.WriteLine("ConcreteComponent.Operation()");
    }
}

装饰器抽象

定义一个装饰器抽象类或接口,称为Decorator,它也实现了Component接口,并在其中添加了一些新的操作:

//装饰器抽象
public abstract class Decorator : IComponent
{
    private IComponent component;

    public Decorator(IComponent component)
    {
        this.component = component;
    }

    public virtual void Operation()
    {
        component.Operation();
    }
}

装饰器实现

//实现多个装饰器类
public class ConcreteDecoratorA : Decorator
{
    public ConcreteDecoratorA(IComponent component) : base(component)
    {
    
    }

    public override void Operation()
    {
        base.Operation();
        Console.WriteLine("ConcreteDecoratorA.Operation()");
    }
}

public class ConcreteDecoratorB : Decorator
{
    public ConcreteDecoratorB(IComponent component) : base(component)
    {
    }

    public override void Operation()
    {
        base.Operation();
        Console.WriteLine("ConcreteDecoratorB.Operation()");
    }
}

接着,我们可以创建并使用一个具有特定功能对象:

IComponent component = new ConcreteComponent();

IComponent decoratorA = new ConcreteDecoratorA(component);

IComponent decoratorB = new ConcreteDecoratorB(decoratorA);

decoratorB.Operation();

输出如下:

ConcreteComponent.Operation()

ConcreteDecoratorA.Operation()

ConcreteDecoratorB.Operation()

上文例子中,我们创建了一个基本对象ConcreteComponent,并创建了两个装饰器ConcreteDecoratorAConcreteDecoratorB,最后,我们使用这些装饰器来创建一个具有特定功能的对象,并调用它的操作方法。输出结果显示,这个对象实际上执行了多个操作,包括基本操作和添加的操作。

需要注意的是,装饰器模式有一些缺点。首先,它可能会导致对象数量的增加,因为每个装饰器都需要一个单独的对象。其次,由于装饰器可以相互嵌套,因此在创建复杂的装饰器结构时可能会变得难以理解和维护。

结论

装饰器模式的优点是它可以动态地添加对象的新行为,而无需改变其原始类。这样,我们可以通过组合不同的装饰器来创建多种对象变体,同时保持原始对象的完整性和一致性。且装饰器模式遵循开放/封闭原则,因为它允许我们添加新的功能,而无需修改现有代码。

标签:IComponent,component,重温,public,---,对象,Operation,设计模式,装饰
From: https://www.cnblogs.com/pandefu/p/17536305.html

相关文章

  • 算法练习-day17
    二叉树110.平衡二叉树题意:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。示例:思路:本题我们可以自下而上判断二叉树是否为平衡二叉树,以上图为示例,我们先判断15是不是平衡二叉树,很明显......
  • 腾讯T3-3级资深架构师呕心整理:10万字节springboot教程全解!
    前言:可以毫不夸张地说,这篇文章介绍的SpringBoot教程基本已经涵盖你工作中遇到的大部分常用的场景。对于每一个springboot的用法,文中都会都会有详细的教程解释。本文总共从29个章节,248页PDF,阐述springboot在各种环境下的各种用法,文中给大家列举出部分的springboot教程,需要这份10......
  • 亲子教育金句-2
    [玫瑰]家庭教育今日分享[玫瑰]“所有孩子的问题,都是父母的问题。”  ---做温柔而坚定的父母!很多时候,作为成年人的父母,不愿意面对自己的过往,特别是与自己父母关系有不良,成长有缺失或者创伤等,情商低,爱的能力差;[嘿哈]不愿意面对曾经的选择,特别是自己的配偶、工作、生活......
  • 解决Docker -v 挂载单文件问题
    问题描述下面命令挂载文件看着没有什么问题吧? dockerrun--namexxxx-p8001:80-v/docker/appsettings.json:/app/appsettings.json-dxxxx:v1.1.0但当我们执行完就会发现文件并没有挂载过来而是给我们创建了一个文件夹 解决方案 官方的建议是挂载文件夹,而不是......
  • Java-Day-30( 多用户即时通信系统 —— 登录 + 获取在线用户列表 )
    Java-Day-30多用户即时通信系统需求分析用户登录拉取在线用户列表无异常退出私聊群聊发文件服务器推送新闻用户登录功能说明我们暂时人为规定用户名/id=100,密码123456就可以登录,其他用户不能登录后面使用HashMap模拟数据库,可以多个用户登录思路......
  • Java-Day-31( 多用户即时通信系统 —— 无异常退出 + 私聊 + 群发 )
    Java-Day-31多用户即时通信系统无异常退出问题指出:客户端输入9退出的是输出在控制台的主线程,退出的是主菜单,并没有真正的退出因为客户端启动后,相当于是开启了一个进程,在这个进程中启动了一个主线程(main线程),在main主线程中又启动了一个客户端的线程(ClientConn......
  • 1-13 编写一个程序,打印输入中单词长度的直方图
    ArchlinuxGCC13.1.1 202304292023-07-1021:56:28星期一 点击查看代码#include<stdio.h>#defineMAX7#defineMIN0intmain(){intnw[10];intnum=0;intnc=0;intc=0;inti,j=0;for(i=0;i<10;i++){......
  • 810-Air724UG(4G全网通GPRS)开发 - 模组把拍摄的照片通过http POST上传到服务器,服务
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/LearnAir724UG"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p> 说明这节是模组控制摄像头采集到图......
  • Java-第一天(初始java)
    在正式学习Java之前,我们可以简单了解下Java进程......也可忽略喔一、Java发展历史Java是世界上使用最广泛的编程语言之一。Java最初由SunMicrosystems在1990年代开发,用于开发从Web应用程序到移动应用程序到批处理应用程序的所有内容。Java最初是一种纯粹的面向对象的语言,但现在......
  • SAM-FastSAM-MobileSAM
    SAM-FastSAM-MobileSAM目录SAM-FastSAM-MobileSAMSAM:FastSAM:MobileSAM参考资料SAM:构建了一个大型分割数据集,包含1100w图像10亿masks模型结构上,包含三个部分图像编码器,灵活的提示编码器和快速的掩码解码器。建立在Transformer视觉模型之上。imageencoder采用VITDet中......