设计模式(九)装饰模式

实际问题

我们生活当中,有很多东西,都是通过不断的装饰外观,而让人更加愿意使用,但本事的内核没变,只是增加了装饰,让使用者更加愿意使用。比如,鼠标的炫酷皮肤,车的车身喷漆等等,数不胜数就不一一举例了。进入话题

装饰模式

意图:动态地给一个对象添加一些额外的职责。就增加功能来说,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();
        }
    }

结果
设计模式(九)装饰模式

总结

该设计模式,只改变具体类的外观,而非内核,可以帮助我们修饰具体的类,而是常用的设计模式之一。

谢谢大家观看

上一篇:电脑连接键盘和鼠标升级


下一篇:Java人机猜拳游戏 (完整代码+详细注释+粘贴即食)