设计模式(三)—装饰模式(结构型)

  • 一、装饰模式简介(Brief Introduction)

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

             优点:把类中的装饰功能从类中搬移出去,这样可以简化原有的类。有效地把类的核心功能和装饰功能区分开了。

    二、装饰模式分析(Analysis)


    自己的理解:

    Component给出一个抽象接口,以规范准备接收附加责任的对象和抽象装饰器。

    ConcreteComponent:定了一个具体的对象,用来接收附加功能的类

    Decorator:持有Component对象的实例,以用它进行装饰,并定义一个与抽象构件接口一致的接口,但对于Component来说,是无需知道Decorator的存在。

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

    说明:

        Decorator与Component之间既是Is a...的继承关系,又是Has a...的组合关系。使用具体装饰类(ConcreteDecorator)来装饰具体构件对象(ConcreteComponent),装饰完的对象依 旧是个Component类型。

        Decorator模式解决的是类的功能的多向扩展,而不是单纯的类的继承。

        Decorator模式提供了比继承更灵活的功能扩展,通过使用不同具体装饰对构件对象的排列组合地包装,能够不同功能的组合。

    例子:

    一个画可以挂在墙上,但通常我们会把这张画镶上画框,蒙上玻璃,然后再挂在墙上。这里的画框和玻璃就是对画的装饰,装饰后成为一个物体,后来实际挂在墙上的是画框。

     

    三.案例分析(Example)

      1.Component

        //Component类 :
    
    定义了具体构件和抽象装饰要实现的方法
    
          
    
        abstract class Component  
    
          
    
        {  
    
          
    
            public abstract void Operation();  
    
          
    
        }  

     2.ConcreteComponent

         //ConcreteComponent类  :用来继承Component抽象类,实现它的Operation()方法
    
          
    
        class ConcreteComponent : Component  
          
    
        {  
    
          
    
            public override void Operation()  
    
          
    
            {  
          
               Console.WriteLine ("具体对象的操作");  
          
            }  
          
        }  

    3.Decorator类

         //Decorator类  :抽象装饰者也实现了抽象构件的接口
    
     
    
          
    
        abstract class Decorator : Component  
    
          
        {  
          //
    
    //把一个抽象构件作为抽象装饰的成员变量。
    
        protected Component component;  
    
          
    
        //在抽象装饰者的构造函数中为抽象构件初始化。 
    
         
            public void SetComponent(Componentcomponent)  
          
    
            {  
    
          
    
                this.component = component;  
    
          
            }  
    
          
    
          
    
          
    
            public override void Operation()  
    
          
    
            {  
    
          
                if (component != null)  
          
                {  
          
                    component.Operation();  
    
          
    
                }  
    
          
    
            }  
    
          
    
        }  

      4.ConcreteDecoratorA类

        //ConcreteDecoratorA类  
    
          
    
                class ConcreteDecoratorA : Decorator   
    
          
    
                {  
    
          
    
                    private  string AddedState;  
    
          
    
                    public override void  Operation()  
          
    
                    {  
    
          
    
                       base.Operation();   //首先运行原Compnent的Operation(),再执行本类的功能,如AddedBehavior,相当于对原Component进行了装饰  
    
          
    
                        AddedState ="New State";     //本类独有的方法
    
         
    
                       Console.WriteLine("具体装饰对象A的操作");  
    
          
    
                    }  
    
          
    
           
    
          
    
                }  

      5.ConcreteDecoratorB类

         
    
          
    
                class ConcreteDecoratorB : Decorator   
    
          
    
                {  
    
                  
    
             public override void  Operation()  
    
          
    
                    {  
    
          
    
                       base.Operation();   //首先运行原Compnent的Operation(),再执行本类的功能,如AddedBehavior,相当于对原Component进行了装饰  
    
          
    
                        AddedBehavior();     //本类独有的方法,以区别于ConcreteDecoratorA  
    
          
    
                       Console.WriteLine("具体装饰对象B的操作");  
          
    
                    }  
    
              
    
                      public void AddedBehavior()  
    
                  {
    
                    }
    
               }  

     5.客户端代码

        //客户端代码  
    
          
    
        static void Main(string[] args)  
    
          
    
        {  
          
    
            ConcreteComponent c = newConcreteComponent();         //需要添加功能的对象
    
           
            ConcreteDecoratorA d1 = newConcreteDecoratorA();       //装饰职能d1
    
            ConcreteDecoratorB d2= newConcreteDecoratorB();          //装饰职能d2
          
           d1.SetComponent(c);    //装饰的方法是:首先用ConcreteComponent实例化对象c,然后用ConcreteDecoratorA的实例化对象d1来包装c,再用ConcreteDecoratorB的对象d2包装d1,最终执行d2的Operation() 
            d2.SetComponent(d1)
    
            d2.Operation();  
    
          
    
            Console.Read();  
    
          
    
        }  

    四、解决的问题(What To Solve)

     

            已经开发完毕的对象,后期由于业务需要,对旧的对象需要扩展特别多的功能,这时候使用给对象动态地添加新的状态或者行为(即装饰模式)方法,而不是使用子类静态继承。

    比如,刚买一辆汽车如下图


    此汽车不符合你的个性要求,比如外表不够美观,发动机马力不足,不能满足你的速度激情,于是你需要对汽车的外表进行装饰,同时需要提高发动机的性能。这些操作通过装饰模式就能很好地解决问题。最终得到如下图所示的个性汽车。


    例子:我们想在各方面改善我们的机房收费系统,我们可以为其添加导出excel表、导出报表、动态连接等功能。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值