裝飾器模式可以在不修改原有代碼的情況下給它增加一個或多個順序可變的擴展功能,且不破環原有代碼的封裝性,使用了OOP的組合+繼承的方式來實現,是一種AOP編程思想的設計模式。
現有如下代碼:
//學生基類
public abstract class StudentBase
{
public string name { get; set; }
public abstract void EatFood();
}
//學生子類1
public class StudentClassOne: StudentBase
{
public override void EatFood()
{
System.Diagnostics.Debug.WriteLine($"{name} 開始吃東西了");
System.Diagnostics.Debug.WriteLine("吃西瓜");
}
}
此時業務邏輯開始發生變化,比如:小花同學還想 吃蘋果、吃梨、吃車釐子;這個時候你可以在“吃西瓜”後面加一些代碼來實現,但這樣每當業務發生變化的時候都要重新修改原有代碼, 破壞了代碼的封裝性,而且不能實現”不同業務場景下吃的東西不一樣,或者吃的順序不一樣“的情況。這個時候就要用到我們的裝飾者模式了:
//聲明一個裝飾者基類
public class StudentDecorator: StudentBase
{
private StudentBase studentBase = null;
public StudentDecorator(StudentBase _studentBase)
{
studentBase = _studentBase;
}
public override void EatFood()
{
studentBase.EatFood();
}
}
//擴展一個吃蘋果的功能
public class StudentEatApple : StudentDecorator
{
public StudentEatApple(StudentBase _studentBase):base(_studentBase)
{
}
public override void EatFood()
{
base.EatFood();
System.Diagnostics.Debug.WriteLine("吃蘋果");
}
}
//擴展一個吃橘子的功能
public class StudentEatOrange : StudentDecorator
{
public StudentEatOrange(StudentBase _studentBase) : base(_studentBase)
{
}
public override void EatFood()
{
base.EatFood();
System.Diagnostics.Debug.WriteLine("吃橘子");
}
}
寫好裝飾者模式之後就可以對此隨意組裝了: