装饰模式


装饰模式,动态的给一个类东西添加新的职能,就增加新功能而言 要比生成子类更有效灵活

装饰模式是一个类对象动态的添加某些新的职能,功能。是添加而不是覆盖,因此装饰模式有个特点就是每个装饰类必须先调用对象的原来的功能和职能,然后执行新添加的职能,这才叫装饰,从代码层次反应就是每次执行的时候都要调用基类的方法:Base.Method()----------个人理解

装饰模式结构图:
查看更多精彩图片

Componet是要装饰的对象抽象类
Conretecomponent是对象抽象类的子类,如果要装饰的对象只有一个,那么就没必要有抽象类,直接又一个具体类就可以了
Decorator是装饰抽象类,是用来装饰Componet类对象的。

//要被装饰的对象抽象类
abstract class Component
{
    public abstarct void operation();
}
//对象抽象类的具体类
abstarct class ConreteComponent:Componet
{
    public override void operation()
   {
       Console.Write("具体对象操作");
   }
}
//要装饰对象的装饰类抽象类,也要继承对象类
abstact class Decorate:Componet
{
   protected Componet com= null;
  public void SedComponet(Componet com)//设置要装饰的对象
  {
    this.com = com;
 }
  public override void operation()//重新操作方法,实际执行的是componet对象的方法
  {
      if(com != null)
      {
          com.operation();
      }
  }
}
//装饰抽象类的具体装饰类A
class ConreteDecoratorA : Decorator
{
     public string addState;//本装饰类特有的职能,区别其他装饰类
     public override void operation()
    {
          base.operation();//先运行原来被装饰对象的职能方法,然后给addstate赋值,再执行本装饰类特有的职能方法
          addstate = "这个装饰类添加新职能";
          Console.Write("具体装饰A的操作");
    }
}
class ConreteDecoratorB : Decorator
{
      public override void operation()
    {
          base.operation();//先运行原来被装饰对象的职能方法,然后再运行本装饰类功能AddNewMethod
          AddNewMethod();
          Console.Write("具体装饰B的操作");
    }
    public void AddNewMethod()
    {
        //装饰类B特有的方法
    }
}

客户端使用的代码
static void Main(string[] arg)
{
     ConreteComponent com = new ConreteComponent();
     ConreteDecoratorA  deA = new ConreteDecoratorA ();
     ConreteDecoratorB deB = new ConreteDecoratorA ();
   
    deA.setComponet(com);//先实例化一个被装饰的对象com,然后具体装饰A装饰com,再用deB装饰deA,最后执行
    deB.setComponent(deA);//deB的operation方法,因为装饰类和对象类都是Component类的具体类,因此都可以
    deB.operation();//是component对象
}


最后一段代码的解释
deA.setComponet(com);
deB.setComponent(deA);
deB.operation();

首先是deB最后执行方法。先到deB的operation方法中。
deB的operation是先执行父类base的operation。这时候base就是deA,然后deA去执行自己的operation,在
deA的中base类就是com对象类,依次循环递归类推,base类总是不同的,所以可以把装饰具体类,全部的装饰具体类都访问到




本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

原文地址:https://www.cnblogs.com/zjypp/p/2319330.html