Decorator装饰模式
1. 简介
- 定义
- 动态地给一个对象增加一些附属的职责。
- 装饰装饰,自然的理解就是在原有物品的基础上(不改变原有物品),增加一些别的东西,让它变得更令人满意。
- 类图
2. 示例
using System;
using
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WindowsFormsApplication1
{
//client
class Program
{
static void Main()
{
Hero hero = new BigHero();
HeroShell s1 = new SpiderManShell(hero);
HeroShell s2 = new SupperManShell(s1);
s2.Attack();
Console.ReadKey();
}
}
//Component
public abstract class Hero
{
public abstract void Attack();
}
//Decorator
public abstract class HeroShell : Hero
{
private Hero _hero;
public HeroShell(Hero hero)
{
_hero = hero;
}
public override void Attack()
{
_hero.Attack();
}
}
//ConcreteDecoratorA
public class SpiderManShell : HeroShell
{
public SpiderManShell(Hero hero) : base(hero) { }
public override void Attack()
{
Console.WriteLine("织网");
Console.WriteLine("撒网");
base.Attack();
}
}
//ConcreteDecoratorB
public class SupperManShell : HeroShell
{
public SupperManShell(Hero hero) : base(hero) { }
public override void Attack()
{
Console.WriteLine("我飞");
Console.WriteLine("我裤衩反穿");
base.Attack();
}
}
//ConcreteComponent
public class BigHero : Hero
{
public override void Attack()
{
Console.WriteLine("我是破坏者,BigHero");
}
}
}
2.1. 框架中的例子
// 泛型集合基接口 component:组成
public interface IEnumerable<out T> : IEnumerable
{ }
// 只读集合接口 decorator:装饰器
public interface IReadOnlyCollection<out T> : IEnumerable<out T>
{ }
// 集合接口 decorator:装饰器
public interface ICollection<T> : IEnumerable<T>
{ }
// 列表接口 decorator:装饰器
public interface IList<T> : ICollection<T>, IEnumerable<T>
{ }
// 列表 concrete-implement: 具体实现
public class List<T> : ICollection<T>, IEnumerable<T>, IList<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, IList
{ }
// 队列 concrete-implement: 具体实现
public class Queue<T> : IEnumerable<T>, IReadOnlyCollection<T>, ICollection
{ }
// 链表 concrete-implement: 具体实现
public class LinkedList<T> : ICollection<T>, IEnumerable<T>, IReadOnlyCollection<T>, IDeserializationCallback, ISerializable
{ }
如果您认为这篇文章还不错或者有所收获,您可以通过右边的"打赏"功能 打赏我一杯咖啡【物质支持】,也可以点击左下角的【好文要顶】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力!
作者: 大师兄石头
来源: https://bigbrotherstone.cnblogs.com/
声明: 原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2020-02-16 多线程共享变量和 AsyncLocal
2020-02-16 ExecutionContext(执行上下文)综述