装饰模式

[ Decorator ]

[
共同的抽象接口 : 为了匹配装饰者 和 被装饰者
被装饰者 : 实现了接口的子类 , 这个类只包含了核心职责
装饰者 : 同样继承了抽象接口 , 只是为了与被装饰者的类型匹配 , 而不是继承其行为
]

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

把类中的装饰功能从类中搬移出去 , 这样可以简化原有的类。
有效地把类的核心职责 和 装饰功能区分开了 , 而且可以去除相关类中重复的装饰逻辑。




装饰者和被装饰对象有相同的超类型。

可以用一个或多个装饰者包装一个对象。

装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。

对象可以在任何时候被装饰,所以可以在运行时动态的,不限量的用你喜欢的装饰者来装饰对象。

装饰模式中使用继承的关键是想达到装饰者和被装饰对象的类型匹配,而不是获得其行为。

装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型。在实际项目中可以根据需要为装饰者添加新的行为,做到“半透明”装饰者。

适配器模式的用意是改变对象的接口而不一定改变对象的性能,而装饰模式的用意是保持接口并增加对象的职责。





定义要进行扩展的类
定义扩展封装类 , 实现了接口里的方法 , 抽象类里定义了一个指定要动态扩展子类的函数
定义具体扩展类 , 继承抽象类 , 实现一个扩展方法 , 重写接口里的主方法 , 并在里面调用扩展方法




源码:

public interface IDecorator
{
  void Decorators();
}



public abstract class AbstractDecorator : IDecorator
{
  private IDecorator decorator;

  public void SetDecorator(IDecorator decorator)
  {
    this.decorator = decorator;
  }

  #region IDecorator 成员

  public virtual void Decorators()
  {
    if (decorator != null)
    {
      decorator.Decorators();
    }
  }

  #endregion
}




public class DecoratorA : AbstractDecorator
{
  //继承的方法
  public override void Decorators()
  {
    base.Decorators();
    DecoratorATest();
  }

  //需要添加扩展的方法
  private void DecoratorATest()
  {
    Console.WriteLine("DecoratorATest");
  }
}




public class DecoratorB : AbstractDecorator
{
  //继承的方法
  public override void Decorators()
  {
    base.Decorators();
    DecoratorBTest();
  }

  //需要动态添加扩展的方法
  private void DecoratorBTest()
  {
    Console.WriteLine("DecoratorBTest");
  }
}




class Program
{
  static void Main(string[] args)
  {
    DecoratorA da = new DecoratorA();
    DecoratorB db = new DecoratorB();
    db.SetDecorator(da);
    db.Decorators();

    Console.ReadKey();
  }
}

posted on 2012-02-21 11:52  多个马甲  阅读(223)  评论(0编辑  收藏  举报