定义:动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。
装饰模式包含如下角色:
- Component(抽象构件):具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法
- ConcreteComponent(具体构件):抽象构件类的子类,用于定义具体的构件对象,实现了在抽象构件中声明的方法,装饰器可以给它增加额外的职责(方法)
- Decorator(抽象装饰类):抽象构件类的子类,用于给具体构件增加职责
- ConcreteDecorator(具体装饰类):抽象装饰类的子类,负责向构件添加新的职责
举例
在原有方法上添加新行为和新方法
- 抽象构建
//原有方法
public abstract class Conponent
{
public abstract void baseFunction();
}
- 具体构建
public class ConcreteConpoment : Conponent
{
public override void baseFunction()
{
Console.WriteLine("基本职责");
}
}
- 抽象装饰类
public abstract class Decorator:Conponent
{
//维护一个父类(抽象构建)对象
private Conponent conponent;//聚合(传入的是具体构建对象)
public Decorator(Conponent conponent)
{
this.conponent = conponent;
}//让子类获取(被具体构建对象覆盖后的)抽象构建对象
public Conponent GetConponent()
{
return conponent;
}//声明新的方法
public abstract void addFuntion();
}
- 具体装饰类
public class ConcreteDecoretor : Decorator
{
public ConcreteDecoretor(Conponent conponent):base(conponent)
{
}public override void baseFunction()
{
//调用原有方法
GetConponent().baseFunction();//在原有方法的基础上新增行为
Console.WriteLine("新增职责1");
}//实现新的方法
public override void addFuntion()
{
Console.WriteLine("新增职责2");
}
}
- 客户类
class Program
{
static void Main(string[] args)
{
//原有职责
Conponent conponent = new ConcreteConpoment();
conponent.baseFunction();//在原有职责的基础上增加了新的职责
Decorator decorator = new ConcreteDecoretor(conponent);
//给原有方法增加了新的行为
decorator.baseFunction();
//调用新的方法
decorator.addFuntion();
}
}
总结:抽象构建和具体构建,负责声明和实现原有方法;抽象装饰类中,声明一个抽象构建对象,并在构造函数中注入被具体构建对象覆盖后的对象,新增一个get该对象的方法,同时可以声明其他新的方法交由子类具体修饰类实现;具体修饰类中,重写原有方法,调用父类中抽象构建对象的原有方法,并可添加新的行为;客户只需要声明抽象修饰类并用具体修饰类覆盖即可。
ps:
- 抽象装饰类中,之所以声明抽象构建对象而不是具体构建对象,是因为其继承的是抽象构建类或接口,无法声明其子类对象;
- 抽象构建可以设计为接口,但是抽象装饰类不行,因为其要继承或实现抽象构建。