设计模式之装饰模式
2017-04-28 21:16
190 查看
装饰者模式,就是动态的给一个对象添加一些职责,他比生成子类更为灵活。这个模式是非常重要的,在我们设计完系统之后,一定还会进行修改,给他添加功能,这时候装饰者模式的好处就不言而喻了。
装饰者模式的工作原理是,创建一个初始对象,然后一步一步的给他添加功能,或者属性。
举个例子:假如初始对象是一个空办公室为装饰对象,通过装饰者1,成为一个有两张办公桌的办公室,这样有两张办公桌的办公室就变成了新的装饰对象。然后这个对象在通过装饰者2 ,变成有电脑的,有办公桌的办公室。这样有电脑的,有办公桌的办公室就变成了新的装饰对象。然后一步一步的去装饰最后变成一个具体的对象,如图所示,像一个链表一样:
现在看一下类图:
下面举一个具体的例子,有一个办公室,里边原来是空的,现在要放的桌子,过几天有要求又要放一个电脑,然后过了一段时间, 又要求放一个花盆。根据开闭原则不能修改,只能增加,所以想到用装饰者模式。
看一下具体的类图,然后对比一下上边给的抽象话的类图,有助于你更好地理解抽象模式:
下边看一下代码:
[csharp] view plain copy print? //抽象办公室
abstract class Bangongshi
{
public abstract void Show();
}
//具体办公室
class Jutibangongshi:Bangongshi
{
public Jutibangongshi()
{ }
public string name;
public Jutibangongshi(string name)
{
this.name = name;
}
public override void Show()
{
Console.WriteLine(”装饰的{0}”, name);
}
}
//办公室装饰
class Zhuangshi : Bangongshi
{
protected Bangongshi bangongshi;
public void SetBangongshi(Bangongshi bangongshi)
{
this.bangongshi = bangongshi;
}
public override void Show()
{
if (bangongshi != null)
{
bangongshi.Show();
}
}
}
//桌子
class Zhuozi : Zhuangshi
{
private string addThing;
public override void Show()
{
addThing = ”桌子”;
Console.Write(addThing);
base.Show();
}
}
//电脑
class Diannao : Zhuangshi
{
private string addThing;
public override void Show()
{
addThing = ”电脑”;
Console.Write(addThing);
base.Show();
}
}
//花盆
class Huapen : Zhuangshi
{
private string addThing;
public override void Show()
{
addThing = ”花盆”;
Console.Write(addThing);
base.Show();
}
<span style=”font-size:18px;”> }</span>
[csharp] view plain copy print?//客户端
static void Main(string[] args)
{
Jutibangongshi office = new Jutibangongshi(“办公室”);
Zhuozi desk = new Zhuozi();
Diannao computer = new Diannao();
Huapen glass = new Huapen();
desk.SetBangongshi(office);
computer.SetBangongshi(desk);
glass.SetBangongshi(computer);
glass.Show();
}
其实,装饰者模式呢,它把类中的一些装饰功能移除,再将这些装饰功能写到另外的类中,这样可以简化核心类的复杂度,同时,面对不同的需求时,可以提供代码得复用。
装饰器模式允许我们在实现中提供扩展点。你可能注意到,在实现装饰者时,我从来没有涉及到Component类。因此,即使它并不拥有类,一样能通过动态添加行为类装饰它,甚至是递归的方式。这些额外的行为可能在几处行为之前或之后添加,或者这种行为可能被阻止。装饰者能在类中提供新方法,甚至新属性。
当然在使用装饰者模式的时候,也一定要慎重,不要感觉差不多,就用装饰模式。所有事情都点到为止。好了,今天就写到这里,以后还会继续更新设计模式博客,请你继续关注。欢迎您能够提出宝贵意见。谢谢
装饰者模式的工作原理是,创建一个初始对象,然后一步一步的给他添加功能,或者属性。
举个例子:假如初始对象是一个空办公室为装饰对象,通过装饰者1,成为一个有两张办公桌的办公室,这样有两张办公桌的办公室就变成了新的装饰对象。然后这个对象在通过装饰者2 ,变成有电脑的,有办公桌的办公室。这样有电脑的,有办公桌的办公室就变成了新的装饰对象。然后一步一步的去装饰最后变成一个具体的对象,如图所示,像一个链表一样:
现在看一下类图:
下面举一个具体的例子,有一个办公室,里边原来是空的,现在要放的桌子,过几天有要求又要放一个电脑,然后过了一段时间, 又要求放一个花盆。根据开闭原则不能修改,只能增加,所以想到用装饰者模式。
看一下具体的类图,然后对比一下上边给的抽象话的类图,有助于你更好地理解抽象模式:
下边看一下代码:
[csharp] view plain copy print? //抽象办公室
abstract class Bangongshi
{
public abstract void Show();
}
//具体办公室
class Jutibangongshi:Bangongshi
{
public Jutibangongshi()
{ }
public string name;
public Jutibangongshi(string name)
{
this.name = name;
}
public override void Show()
{
Console.WriteLine(”装饰的{0}”, name);
}
}
//办公室装饰
class Zhuangshi : Bangongshi
{
protected Bangongshi bangongshi;
public void SetBangongshi(Bangongshi bangongshi)
{
this.bangongshi = bangongshi;
}
public override void Show()
{
if (bangongshi != null)
{
bangongshi.Show();
}
}
}
//桌子
class Zhuozi : Zhuangshi
{
private string addThing;
public override void Show()
{
addThing = ”桌子”;
Console.Write(addThing);
base.Show();
}
}
//电脑
class Diannao : Zhuangshi
{
private string addThing;
public override void Show()
{
addThing = ”电脑”;
Console.Write(addThing);
base.Show();
}
}
//花盆
class Huapen : Zhuangshi
{
private string addThing;
public override void Show()
{
addThing = ”花盆”;
Console.Write(addThing);
base.Show();
}
<span style=”font-size:18px;”> }</span>
//抽象办公室 abstract class Bangongshi { public abstract void Show(); } //具体办公室 class Jutibangongshi:Bangongshi { public Jutibangongshi() { } public string name; public Jutibangongshi(string name) { this.name = name; } public override void Show() { Console.WriteLine("装饰的{0}", name); } } //办公室装饰 class Zhuangshi : Bangongshi { protected Bangongshi bangongshi; public void SetBangongshi(Bangongshi bangongshi) { this.bangongshi = bangongshi; } public override void Show() { if (bangongshi != null) { bangongshi.Show(); } } } //桌子 class Zhuozi : Zhuangshi { private string addThing; public override void Show() { addThing = "桌子"; Console.Write(addThing); base.Show(); } } //电脑 class Diannao : Zhuangshi { private string addThing; public override void Show() { addThing = "电脑"; Console.Write(addThing); base.Show(); } } //花盆 class Huapen : Zhuangshi { private string addThing; public override void Show() { addThing = "花盆"; Console.Write(addThing); base.Show(); } }客户端代码:
[csharp] view plain copy print?//客户端
static void Main(string[] args)
{
Jutibangongshi office = new Jutibangongshi(“办公室”);
Zhuozi desk = new Zhuozi();
Diannao computer = new Diannao();
Huapen glass = new Huapen();
desk.SetBangongshi(office);
computer.SetBangongshi(desk);
glass.SetBangongshi(computer);
glass.Show();
}
//客户端 static void Main(string[] args) { Jutibangongshi office = new Jutibangongshi("办公室"); Zhuozi desk = new Zhuozi(); Diannao computer = new Diannao(); Huapen glass = new Huapen(); desk.SetBangongshi(office); computer.SetBangongshi(desk); glass.SetBangongshi(computer); glass.Show(); }看一下结果:
其实,装饰者模式呢,它把类中的一些装饰功能移除,再将这些装饰功能写到另外的类中,这样可以简化核心类的复杂度,同时,面对不同的需求时,可以提供代码得复用。
装饰器模式允许我们在实现中提供扩展点。你可能注意到,在实现装饰者时,我从来没有涉及到Component类。因此,即使它并不拥有类,一样能通过动态添加行为类装饰它,甚至是递归的方式。这些额外的行为可能在几处行为之前或之后添加,或者这种行为可能被阻止。装饰者能在类中提供新方法,甚至新属性。
当然在使用装饰者模式的时候,也一定要慎重,不要感觉差不多,就用装饰模式。所有事情都点到为止。好了,今天就写到这里,以后还会继续更新设计模式博客,请你继续关注。欢迎您能够提出宝贵意见。谢谢
相关文章推荐
- 设计模式---装饰模式
- NET设计模式之一:装饰模式(Decorator Pattern)
- 设计模式中结构型模式(四)装饰模式(Decorator)
- 设计模式c#描述——装饰(Decorator)模式
- 第四个设计模式:装饰模式
- 设计模式c#语言描述——装饰(Decorator)模式
- 结构型设计模式---Decorator模式(装饰模式)
- .NET设计模式研究之装饰模式
- 解读设计模式----装饰模式(Decorator Pattern)
- 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)
- 用实例解说Dot Net设计模式——装饰模式
- 第四个设计模式:装饰模式
- AspectJ实现设计模式(七)—装饰模式
- 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)
- 设计模式之---装饰(decorator)
- 设计模式c#语言描述——装饰(Decorator)模式
- 设计模式之装饰模式篇(Decorator)
- 设计模式之--装饰器模式的硬编码的静态装饰和链化
- 设计模式学习笔记-装饰模式
- 设计模式(11)-装饰模式(Decorator)