• 装饰模式


    【装饰模式】

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

     

    Component是定义一个对象接口,可以给这些对象动态的添加职责。

    ConcreteComponent是定义一个具体的对象,也可以给这个对象添加一些职责。

    Decorator装饰抽象类,继承了Component类,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator类的存在的。至于ConcreteDecorator

    就是具体的装饰对象,起到给Component添加职责的功能。

     

    【优点】:把类中的装饰功能从类中搬移到类外,这样可以简化原有的类;能有效的把核心职责和装饰功能区分开,而且可以除去相关类中重复的逻辑。

     

    【示例代码】

    using System;

    //Component是定义一个对象接口,可以给这些对象动态的添加职责。

    abstract class Componet

    {

        public abstract void Operation();

    }

    // 具体要操作的对象,实现上面的Componet接口,将要添加的职责移到类外。

    class ConcreteComponent : Componet

    {

        public override void Operation()

        {

            Console.WriteLine("具体对象的操作");

        }

    }

    // 装饰类基类,也实现Componet接口。并保存一个Componet类的引用。

    // 相当于是两次继承。

    abstract class Decorator : Componet

    {

        protected Componet component;

        public void SetComponent(Componet component)

        {

            this.component = component;

        }

        public override void Operation()

        {

            if (component != null)

            {

                //重写Operation(),实际执行的是Component雷的Operation();

                component.Operation();

            }

        }

    }

    //进行A装饰;

    class ConcreteDecoratorA : Decorator

    {

        private string addedState;

        public override void Operation()

        {

            //先完成本来要进行的操作;

            base.Operation();

            addedState="new State";

            Console.WriteLine("对具体对象进行“A装饰”的操作");

        }

    }

    //进行B装饰;

    class ConcreteDecoratorB : Decorator

    {

        public override void Operation()

        {

            base.Operation();

            AddedBehavior();

            Console.WriteLine("对具体对象进行“B装饰”的操作");

        }

        private void AddedBehavior()

        { }

    }

    ///////////////////////////////////////////////////////////////////////////////

    /*客户端代码*/

    class APP

    {

         static void Main()

         {

             ConcreteComponent c = new ConcreteComponent();

             ConcreteDecoratorA d1 = new ConcreteDecoratorA();

             ConcreteDecoratorB d2 = new ConcreteDecoratorB();

     

             d1.SetComponent(c);//对c进行A装饰;

             d2.SetComponent(d1);//对d1进行B装饰;

             d2.Operation();

     

             Console.Read();

         }

    }  
    例子:以人的装扮为例。

    【代码实现】

    using System;

    //Person类

    class Person

    {

      public Person(){}

      private string name;

      public Person(string name)

      {

        this.name=name;

      }

      public virtual void Show()

      {

        Console.WriteLine("装扮的{0}",name);

      }

    }

    //服饰类:继承自Person,并维护一个Person的引用。

    class Finery:Person

    {

      protected Person component;

      //打扮

      public void Decorate(Person component)

      {

        this.component=component;

      }

      public override void Show()

      {

        if(component!=null)

    {

      component.Show();

    }

      }

    }

     

    //具体服饰类;继承自装饰类;

    class TShirts:Finery

    {

      public override void Show()

      {

        base.Show();

        Console.WriteLine("T恤衫"); 

      }

     

    }

    class Sneakers:Finery

    {

      public override void Show()

      {

        base.Show();

        Console.WriteLine("胶底运动鞋");

      }

     

    }

    class Trousers:Finery

    {

      public override void Show()

      {

        base.Show();

    Console.WriteLine("短裤");

      }

     

    }

    class LeatherShoes:Finery

    {

      public override void Show()

      {

        base.Show();

    Console.WriteLine("皮鞋");

      }

     

    }

    //客户代码

    class App

    {

      static void Main()

      {

       Person xs=new Person("小山");

       Console.WriteLine("第一种装扮");

       

       Sneakers sk=new Sneakers();

       Trousers ts=new Trousers();

       TShirts tst=new TShirts();

       

       sk.Decorate(xs);

       ts.Decorate(sk);

       tst.Decorate(ts);

       tst.Show();

      }

    }

     

  • 相关阅读:
    当前form窗体随系统屏幕变化
    js类型检测
    js和jquery中的遍历对象和数组(forEach,map,each)
    学了display:flex垂直居中容易多了
    php发送get和post请求
    php输出日志的实现
    php每天自动备份数据库
    windows计划任务
    Css Sprite 图片等比缩放图片大小
    使用js编写一个简单的运动框架
  • 原文地址:https://www.cnblogs.com/zhangqs008/p/2802262.html
Copyright © 2020-2023  润新知