设计模式(1)装饰模式小菜扮靓


前言:


装饰模式:动态给对象添加一些额外的职责。


结构图


角色


 Componet(抽象构件角色)


定义一个抽象接口,为对象添加职责


abstract class Component
{
     public abstract void Operation();
}

ConcreteComponent(具体构件角色)


抽象构件角色:定义一个抽象接口,来规范准备附加功能的类


class ConcreteComponent : Component
{
     public override void Operation ()
      {
                console.writeline("具体对象操作");
      }
}


        Decorator( 抽象装饰者角色)


定义与抽象构件角色相同的接口。实际上执行的还是抽象构件角色的方法。


abstract class Decorator:Component 
{
    protected Component component;
    public void Setcomponent (Component component )             //构造函数对属性赋值
    {
           this.component=component;
     }
      public override void Operation()
      {
            if (component ! =null)
            {
                  component.Operation();
             }
       }
}


ConcreteDecoratorA (具体装饰者角色)


实现装饰者角色,添加额外功能

class ConcreteDeratorA:Decorator 
{
      private string addedState;
      public override void Operation()
      {
            base.Operation();
            addstate="new state";
            console.writeline("具体装饰对象A的操作");
       }
}


Demo (来自《大话设计模式.程杰》)



“小菜扮靓”

ConcreteComponent



 //person类。concrete component 
    class Person
    {
        public Person()              //空的构造函数为后面声明一个变量铺垫
        { }
        private string name;
        public Person(string name)   //带有参数的构造函数为类的属性进行赋值
        {
            this.name = name;
        }
        public virtual void show()   //显示“装扮”方法
        {
            Console.WriteLine("装扮的{0}",name );      //{0}参数化的占位符,显示变量name的内容
        }
    }


Decorator


 class Finery : Person
    {
        protected Person component;
        //通过属性赋值的方式给给定的类进行装扮
        public void Decorate(Person component)             //后面不断调用对象的Decorator方法对对象进行有顺序的赋值
        {
            this.component = component;
        }
        public override void show()                        //基类的方法显示装饰内容
        {
            if (component != null)
            {
                component.show();
            }
        }
    }


ConcreteDecorator


   //具体的服饰类
    class Tshirts : Finery
        {
            public override void show()         //实际上是person类的方法执行
            {
                Console.WriteLine ("大T衬衣");
                base.show();                //实际上是person类的show方法
            }
        }
    class BigTrouser : Finery
        {
            public override void show()
            {
                Console.WriteLine ("大垮裤");
                base.show();
            }
        }
}



客户端 


static void Main(string[] args)
        {
            Person chen = new Person("小菜");
            Console.WriteLine("第一种装扮");

            Tshirts aa = new Tshirts();                //Tshirts类是继承Finery。而Finery拥有Decorate方法
            BigTrouser bb = new BigTrouser();

            aa.Decorate(chen);              //对象调用Decorate方法对对象进行有顺序装饰
            bb.Decorate(aa );
            bb.show();

            
        }


结果






posted @ 2013-02-01 16:47  陈方林  阅读(185)  评论(0编辑  收藏  举报