实际问题
我们生活当中,有很多东西,都是通过不断的装饰外观,而让人更加愿意使用,但本事的内核没变,只是增加了装饰,让使用者更加愿意使用。比如,鼠标的炫酷皮肤,车的车身喷漆等等,数不胜数就不一一举例了。进入话题
装饰模式
意图:动态地给一个对象添加一些额外的职责。就增加功能来说,D e c o r a t o r 模式相比生成子类更为灵活。
适用性:
- 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
- 处理那些可以撤消的职责。
- 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
结构:
我们这里的类来一一讲解。
首先是 Component抽象类,它是用来管理具体使用类,和装饰类的父类。
ConcreteComponent类,是我们被装饰的类,可以有多个。
Decorator类 是装饰类,统一管理具体的装饰类的
ConcreteDecorator类 就是具体装饰类了
来看实例吧
实例
我们有一个电脑抽象类,子类分别是具体的电脑类和电脑装饰类。
Computer类
public abstract class Computer
{
public abstract void Show();
}
AppleComputer类(具体电脑类)
public class AppleComputer : Computer
{
public override void Show()
{
Console.WriteLine("电脑: 苹果电脑");
}
}
ComputerDecorator类(装饰类)
public class ComputerDecorator : Computer
{
private Computer computer;
public override void Show()
{
computer?.Show();
}
public void SetDecorator(Computer computer)
{
this.computer = computer;
}
}
这里我们有两个装饰,一个是键盘, 一个是鼠标
MechanicalKeyboard类(键盘)
public class MechanicalKeyboard : ComputerDecorator
{
public override void Show()
{
base.Show();
Console.WriteLine("键盘: 机械键盘");
}
}
AppleMouse类(鼠标类)
public class AppleMouse : ComputerDecorator
{
public override void Show()
{
base.Show();
Console.WriteLine("鼠标: 苹果鼠标");
}
}
类图
调用端
class Program
{
static void Main()
{
AppleComputer computer = new AppleComputer();
MechanicalKeyboard keyboard = new MechanicalKeyboard();
AppleMouse mouse = new AppleMouse();
keyboard.SetDecorator(computer);
mouse.SetDecorator(keyboard);
mouse.Show();
}
}
结果
总结
该设计模式,只改变具体类的外观,而非内核,可以帮助我们修饰具体的类,而是常用的设计模式之一。
谢谢大家观看