结构型模式 - 装饰器模式Decorator
1.你这老母亲的,我哪来的广告?
学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。
装饰器模式的定义与特点
装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
装饰器模式优点有:
- 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
- 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
- 装饰器模式完全遵守开闭原则
装饰器模式的缺点是:
- 装饰器模式会增加许多子类,过度使用会增加程序得复杂性。
装饰器模式的结构与实现
通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰器模式的目标。下面来分析其基本结构和实现方法。
1. 模式的结构
装饰器模式主要包含以下角色。
- 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
- 具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
- 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
- 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
装饰器模式的结构图如图 1 所示。

using DesignPattern.DecoratorPattern;
using System;
namespace DesignPattern
{
internal class Program
{
static void Main(string[] args)
{
DecoratorHelper();
}
#region Pattern - Decorator
static void DecoratorHelper()
{
DrinkDecorator _syrup = new Syrup();
DrinkDecorator _coffee = new Coffee();
DrinkDecorator _sodaWater = new SodaWater();
_syrup = new Ice(_syrup);
_coffee = new Sugar(_coffee);
_sodaWater = new Mint(_sodaWater);
_sodaWater = new Ice(_sodaWater);
Console.WriteLine($"{_syrup.Des} {_syrup.Cost}");
Console.WriteLine($"{_coffee.Des} {_coffee.Cost}");
Console.WriteLine($"{_sodaWater.Des} {_sodaWater.Cost}");
Console.ReadLine();
}
#endregion
}
}
//======================================================================================
namespace DesignPattern.DecoratorPattern
{
/// <summary>
/// 抽象饮品装饰者类
/// </summary>
public abstract class DrinkDecorator
{
/// <summary>
/// 名字
/// </summary>
protected string Name { get; set; }
/// <summary>
/// 售价
/// </summary>
protected int Price { get; set; }
/// <summary>
/// 介绍:名字
/// </summary>
public abstract string Des { get; }
/// <summary>
/// 售价
/// </summary>
public abstract int Cost { get; }
}
/// <summary>
/// 汽水
/// </summary>
public class SodaWater : DrinkDecorator
{
public SodaWater()
{
Name = "汽水";
Price = 8;
}
public override string Des => this.Name;
public override int Cost => this.Price;
}
/// <summary>
/// 咖啡
/// </summary>
public class Coffee : DrinkDecorator
{
public Coffee()
{
Name = "咖啡";
Price = 15;
}
public override string Des => this.Name;
public override int Cost => this.Price;
}
/// <summary>
/// 果汁
/// </summary>
public class Syrup: DrinkDecorator
{
public Syrup()
{
Name = "果汁";
Price = 12;
}
public override string Des => this.Name;
public override int Cost => this.Price;
}
/// <summary>
/// 配料
/// </summary>
public abstract class Batching : DrinkDecorator
{
protected readonly DrinkDecorator m_drink;
public Batching(DrinkDecorator drink)
{
m_drink = drink;
}
public override string Des => $"{m_drink.Des} + {this.Name}";
public override int Cost => m_drink.Cost + Price;
}
public class Sugar : Batching
{
public Sugar(DrinkDecorator drink) : base(drink)
{
Name = "糖";
Price = 2;
}
}
public class Ice : Batching
{
public Ice(DrinkDecorator drink) : base(drink)
{
Name = "冰块";
Price = 1;
}
}
public class Mint : Batching
{
public Mint(DrinkDecorator drink) : base(drink)
{
Name = "薄荷";
Price = 3;
}
}
}
希望大家:点赞,留言,关注咯~
😘😘😘😘
唠家常
今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加我QQ:841298494,大家一起进步。
- 客官,看完get之后记得点赞哟!
- 小伙伴你还想要别的知识?好的呀,分享给你们😄
今日推荐
本文来自博客园,作者:青衫磊落长歌行,转载请注明原文链接:https://www.cnblogs.com/WenhaoWang/p/17073498.html
身负灵石行天下,冲关断喝辨正邪; 仙籍经文誊卷上,日省三身驭鬼神; 奇门遁甲游四方,九星八门断吉凶; 仙宝葫芦聚灵兽,乾坤凝练化神火; 八卦灵镜控震雷,凛然正气荡妖魔; 虚怀若谷尝百草,岐黄妙术展幡旗; 祈符笔走通九幽,素手悬铃摄心魂; 依剑证道心通明,青衫磊落长歌行。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步