装饰模式

【装饰模式】

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

 

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

  }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值