装饰模式

简介:

【装饰模式】

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

 

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

  }

}

 

目录
相关文章
|
8天前
|
设计模式
装饰器模式
装饰器模式
7 0
|
1月前
|
设计模式 C++
【C++】—— 装饰器模式
【C++】—— 装饰器模式
|
8月前
装饰者模式
装饰者模式
46 0
|
8月前
|
设计模式
2023-6-26-第八式装饰器模式
2023-6-26-第八式装饰器模式
59 0
|
9月前
打扮一下(装饰模式)
打扮一下(装饰模式)
42 0
|
9月前
装饰模式
装饰模式
40 0
装饰模式——添衣加被
装饰模式——添衣加被
|
10月前
|
前端开发 BI
关于装饰器模式我所知道的
关于装饰器模式我所知道的
50 0
|
10月前
|
设计模式
我认为的装饰器模式
我认为的装饰器模式
72 0
|
11月前
|
Java
结构型模式-装饰者模式
结构型模式-装饰者模式
68 0

热门文章

最新文章