设计模式(八):装饰模式

一、定义

装饰者模式:动态地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式比生成子类更为灵活。

Decorator模式的工作原理是:可以创建始于Decorator对象(负责新的功能的对象)终于原对象的一个对象“链”。

二、实例:手机屏幕装饰

2.1 手机

复制代码
public abstract  class Phone
    {
        public abstract void Print();        
    }

    public class Apple : Phone
    {
        public override void Print()
        {
            Console.WriteLine("我是苹果手机");
        }
    }
复制代码

2.2 装饰者

这里的关键就是形成一个链

复制代码
public abstract class BaseDecorator : Phone
    {
        public Phone phone;
        public BaseDecorator(Phone p)
        {
            phone = p;
        }
        public override void Print()
        {
            if (phone != null)
            {
                phone.Print();
            }
        }
    }
复制代码

 

复制代码
 public class Screen:BaseDecorator
    {
        public Screen(Phone p) : base(p)
        {
        }
        public override void Print()
        {
            Decorat();
            base.Print();
           
        }
        private void Decorat()
        {
            Console.WriteLine("屏幕装饰.");
        }
    }

    public class Num : BaseDecorator
    {
        public Num(Phone p) : base(p)
        {
        }
        public override void Print()
        {
            Decorat();
            base.Print();
           
        }
        private void Decorat()
        {
            Console.WriteLine("键盘装饰.");
        }
    }
复制代码

2.3 客户端

//-----------------------装饰模式---------------------
            Decorator.Phone phone = new Decorator.Apple();
            Decorator.BaseDecorator screen = new Decorator.Screen(phone);
            Decorator.BaseDecorator num = new Decorator.Num(screen);
            num.Print();
            Console.ReadKey();

 运行时多态,首先有手机而且是一部苹果手机,接下来我要装饰这部手机的屏幕(贴个膜?),然后再去在按键上做装饰(贴个钻?)

当我们执行 按键的输出—>输出“键盘装饰”—>而后转入父类的输出函数—>键盘的父类是Screen—>此时执行父类的输出函数,“屏幕装饰”—>以此类推直到对象本身

 

三、总结

装饰模式将多态在运行时运用得很巧妙,实现了装饰链,从最小到最外层的层层装饰。这样的设计可以更好的拓展我们的类的功能。

posted @   K战神  阅读(219)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示