[Design Patterns]Decorator Pattern

裝飾模式,屬於『結構型模式』。

目的

動態的給一個類別順序添加額外的職責,就增加功能來說比生成子類更為靈活。

角色

  • 抽象零件(Component):為具體零件的父類別。
  • 具體零件(ConcreteComponent):繼承抽象零件
  • 抽象裝飾(Decorator):繼承抽象零件,擴展抽象零件功能
  • 具體裝飾(ConcreteDecorator):具體添加功能給component

優點

  • 將裝飾功能搬出類別,可簡化原類別。
  • 可以去除相關類中重複的裝飾邏輯

缺點

  • 裝飾要考慮順序性,例如:穿衣,要先穿內衣,再穿TShirt。
  • 裝飾如果多的話,要寫很多子類。

UML

UML

實際範例:人穿衣

  • 具體零件:使用虛擬方法,也可不用抽象零件,帶入名字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Person
{
private string name;

public Person()
{
}

public Person(string name)
{
this.name = name;
}

public virtual void Show()
{
Console.WriteLine($"裝扮的{name}");
}
}
  • 抽象裝飾:要有個裝飾方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Finery : Person
{
protected Person person;

public void Decorate(Person person)
{
this.person = person;
}

public override void Show()
{
if (person != null)
{
person.Show();
}
}
}
  • 具體裝飾:覆寫Show,需包含base
1
2
3
4
5
6
7
8
class TShirts : Finery
{
public override void Show()
{
Console.Write("大T薛 ");
base.Show();
}
}
  • 使用方式
1
2
3
4
5
6
7
8
9
10
11
Person xc = new Person("阿龍");
Console.WriteLine("第一種裝扮:");

BigTrouser kk = new BigTrouser();
TShirts dtx = new TShirts();

kk.Decorate(xc);
dtx.Decorate(kk);
dtx.Show();

Console.Read();
-------------The End-------------