结构型设计模式——装饰器模式

在不修改原有对象代码的情况下,通过“装饰器”类动态添加一些额外的职责。就功能而言,Decorator模式比生成子类更灵活。

适用于

①在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责

②处理那些可以撤销的职责

③当不能采用生成子类的方式进行扩充时。一种情况是,可能有大量独立地扩展,为支持一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是,由于类定义被隐藏,或者类定义不能用于生成子类。

类图如下

 

1     internal class Program
2     {
3         static void Main(string[] args)
4         {
5             ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA(new ConcreteDecoratorB(new ConcreteComonent()));
6 
7             concreteDecoratorA.Operation();
8         }
9     }
View Code
1     /// <summary>
2     /// 构建类(可以是abstract类型,接口扩展更灵活)
3     /// </summary>
4     /// 就是为这个类动态添加一些职责或者功能
5     internal interface Comonent
6     {
7         void Operation();
8     }
View Code
 1     /// <summary>
 2     /// 装饰器类,继承并且组合需要扩展的类
 3     /// </summary>
 4     internal abstract class Decorator : Comonent
 5     {
 6         private Comonent comonent;
 7 
 8         protected Decorator(Comonent comonent)
 9         {
10             this.comonent = comonent;
11         }
12 
13         public virtual void Operation()
14         {
15             comonent.Operation();
16         }
17     }
View Code
 1     /// <summary>
 2     /// 具体装饰器类,实现具体扩展职责,按照维度可以是不同的类
 3     /// </summary>
 4     internal class ConcreteDecoratorA : Decorator
 5     {
 6         public ConcreteDecoratorA(Comonent comonent) : base(comonent)
 7         {
 8         }
 9 
10         public override void Operation()
11         {
12             base.Operation();
13             Console.WriteLine("添加职责A");
14         }
15     }
View Code
 1     internal class ConcreteDecoratorB : Decorator
 2     {
 3         public ConcreteDecoratorB(Comonent comonent) : base(comonent)
 4         {
 5         }
 6 
 7         public override void Operation()
 8         {
 9             base.Operation();
10             Console.WriteLine("添加职责B");
11         }
12     }
View Code

 

 1     /// <summary>
 2     /// 需要添加职责的具体类
 3     /// </summary>
 4     internal class ConcreteComonent : Comonent
 5     {
 6         public void Operation()
 7         {
 8             Console.WriteLine("基础功能");
 9         }
10     }
View Code

 

posted @ 2025-04-09 22:32  是铭不是明  阅读(11)  评论(0)    收藏  举报