zoukankan      html  css  js  c++  java
  • 装饰模式

    【装饰模式】

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

     

    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();

      }

    }

     

  • 相关阅读:
    cf C. Vasya and Robot
    zoj 3805 Machine
    cf B. Vasya and Public Transport
    cf D. Queue
    cf C. Find Maximum
    cf B. Two Heaps
    cf C. Jeff and Rounding
    cf B. Jeff and Periods
    cf A. Jeff and Digits
    I Think I Need a Houseboat
  • 原文地址:https://www.cnblogs.com/zhangqs008/p/2802262.html
Copyright © 2011-2022 走看看