zoukankan      html  css  js  c++  java
  • 设计模式(八):装饰模式

    一、定义

    装饰者模式:动态地给一个对象添加一些额外的职责,就增加功能来说,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—>此时执行父类的输出函数,“屏幕装饰”—>以此类推直到对象本身

    三、总结

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

  • 相关阅读:
    利用JavaScript+DIV+CSS实现下拉菜单。当鼠标移动到菜单选项的时候显示对应的DIV:function show(menu)。当鼠标移出的时候隐藏所有的DIV:function hide()。
    java编程——图片旋转
    名言
    利用CSS对注册页面实现修饰
    软件过程
    Warning: Failed to halt at after bootloader, forced stop at
    cc2650 7x7封装更换为 5X5 4x4
    IAR 路径导致的错误
    cc2650-cc2640蓝牙开发准备手记
    window10装机 nvem简介,针对于 联想R720系列
  • 原文地址:https://www.cnblogs.com/sunchong/p/5122887.html
Copyright © 2011-2022 走看看