• 装饰者模式


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

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

    适用性

    在以下情况下可以使用 Decorator 模式:

    • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
    • 处理那些可以撤销的职责。
    • 当不能采用生成子类的方法进行扩充时。

    缺点

    • Decorator 是一个透明的包装,其与 Component 还是有些差别的。
    • 采用 Decorator 模式进行系统设计往往会产生许多看上去类似的小对象。导致很难学习系统,排错也很困难。

    效果

    • 比静态继承更灵活。
    • 避免在层次结构高层的类有太多的特征。

    结构

    例:

        class Program
        {
            static void Main(string[] args)
            {
                Car car=new Car();
                car.Operation();
    
                ComponentA componentA = new ComponentA(car);
                componentA.Operation();
    
                Console.WriteLine("
    ");
    
                Truck truck = new Truck();
                truck.Operation();
    
                ComponentB componentB=new ComponentB(truck);
                componentB.Operation();
    
                Console.ReadKey();
            }
    
            public class Car : Component
            {
                public override void Operation()
                {
                    Console.WriteLine("我是普通的轿车,速度90km/h!
    ");
                }
            }
    
            public class Truck:Component
            {
                public override void Operation()
                {
                    Console.WriteLine("我是普通的卡车,速度50km/h!
    ");
                }
            }
    
            public abstract class Component
            {
                public abstract void Operation();
            }
    
            public class ComponentA : Component
            {
                private Component _component;
    
                public ComponentA(Component component)
                {
                    this._component = component;
                }
    
                public override void Operation()
                {                
                    this._component.Operation();
                    AddNewEngine();
                    Console.WriteLine("增加了液氮推进器,速度狂飙到200km/h!
    ");
                }
    
                public void AddNewEngine()
                {
                    Console.Write("增加液氮推进器!
    ");
                }
            }
    
            public class ComponentB:Component
            {
                private Component _component;
    
                public ComponentB(Component component)
                {
                    _component = component;
                }
    
                public override void Operation()
                {
                    
                    _component.Operation();
                    AddNewEngine();
                    Console.WriteLine("增加了火箭推进器,速度狂飙到300km/h!
    ");
                }
    
                public void AddNewEngine()
                {
                    Console.WriteLine("增加火箭推进器!
    ");
                }
            }
        }
    

      运行结果:

  • 相关阅读:
    pytest.mark.parametrize里面indirect参数详细解释
    linux环境安装python环境
    gitlab怎么给别人新增项目权限
    VMware虚拟机下的CentOS7如果Ping不通百度,解决办法
    ip configuration could not be reserved (no available address timeout etc.)虚拟机连接不上网卡解决办法
    虚拟机安装教程
    auto_now与auto_now_add之间的区别
    【二分答案】洛谷P2678 [NOIP2015 提高组] 跳石头/P1824 进击的奶牛/P2440木材加工/P1873 砍树
    团体程序设计天梯赛PTA L2-021点赞狂魔
    团体程序设计天梯赛PTA L2-020功夫传人
  • 原文地址:https://www.cnblogs.com/superCow/p/3848702.html
Copyright © 2020-2023  润新知