装饰器模式可以在不修改原有代码的情况下给它增加一个或多个顺序可变的扩展功能,且不破环原有代码的封装性,使用了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("吃橘子");
}
}
写好装饰者模式之后就可以对此随意组装了: