设计模式<结构型> | 装饰器模式

装饰器模式(Proxy Pattern)

通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。这也是判断是否该用装饰器模式的一个重要的依据。除此之外,装饰器模式还有一个特点,那就是可以对原始类嵌套使用多个装饰器。为了满足这个应用场景,在设计的时候,装饰器类需要跟原始类继承相同的抽象类或者接口。

结构图:

角色:

  1. 抽象部件(Component):声明公用接口,规定了被装饰类的行为。
  2. 具体部件(Concrete Component): 被装饰对象,实现抽象构件,通过装饰角色为其添加一些职责。。
  3. 抽象装饰(Decorator):继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
  4. 具体装饰类(Concrete Decorators):实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

适用场景:

  1. 当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。
  2. 功能要求动态地添加、撤销时。

优点:

  1. 无需创建新子类即可扩展对象的行为。
  2. 可以用多个装饰封装对象来组合几种行为。
  3. 可以在运行时添加或删除对象的功能。

缺点

  1. 代码可读性比较差。

代码(C#)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/// <summary>
/// 形状 抽象部件(Component)
/// </summary>
public interface IShape
{
void Draw();
}

/// <summary>
/// 圆圈 具体部件(Concrete Component)
/// </summary>
public class Circle : IShape
{
public void Draw()
{
Console.WriteLine("Shape: Circle");
}
}

/// <summary>
/// 抽象装饰(Decorator)
/// </summary>
public abstract class ShapeDecorator : IShape
{
protected IShape decoratedShape;

public ShapeDecorator(IShape decoratedShape)
{
this.decoratedShape = decoratedShape;
}

public void Draw()
{
decoratedShape.Draw();
}
}
/// <summary>
/// 具体装饰类(Concrete Decorators)
/// </summary>
public class RedShapeDecorator : ShapeDecorator
{
public RedShapeDecorator(IShape decoratedShape) : base(decoratedShape)
{
}

public void Draw()
{
decoratedShape.Draw();
// 扩展
SetRedBorder(decoratedShape);
}

private void SetRedBorder(IShape decoratedShape)
{
Console.WriteLine("Border Color: Red");
}
}

IShape redCircle = new RedShapeDecorator(new Circle());
redCircle.Draw();

最后

代理模式和装饰者模式都是代码增强这一件事的落地方案。前者偏重业务无关,高度抽象,和稳定性较高的场景。后者偏重业务相关,定制化诉求高,改动较频繁的场景。代理模式中,代理类附加的是跟原始类无关的功能,而在装饰器模式中,装饰器类附加的是跟原始类相关的增强功能。


设计模式<结构型> | 装饰器模式
http://example.com/posts/64336.html
作者
她微笑的脸y
发布于
2023年3月1日
许可协议