装饰者模式——动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。(摘自《Head First Design Patterns》)
以下是自已用VS画了一个简图:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/lihui_830501/Decorator.png)
本文意要创建一把剑,给它装饰不同的属性来增加不同的效果,以达到装饰者模式的思想。
首先,创建武器抽象基类
public abstract class Weapon
{
private string Appearance;
private int Aggressivity;
public abstract string GetAppearance();
public abstract int GetAggressivity();
public void Show()
{
Console.WriteLine(GetAppearance() + " 攻击力:" + GetAggressivity().ToString());
}
show方法意在输出测试结果。 下面创建装饰者的基类:
public abstract class Decorator : Weapon
{
public Weapon Weapon;
}
很简单的一个抽象类,当然可以自由扩充一些方法等,但在此只是为了以最简单的方式表达装饰者模林思想。
实现三个装饰者,目的是给剑附上冰,火,风等属性:
public class GlacialDecorator : Decorator
{
public GlacialDecorator(Weapon w)
{
base.Weapon = w;
}
public override string GetAppearance()
{
return base.Weapon.GetAppearance() + " 附冰属性";
}
public override int GetAggressivity()
{
return base.Weapon.GetAggressivity() + 50;
}
}
public class FireDecorator : Decorator
{
public FireDecorator(Weapon w)
{
base.Weapon = w;
}
public override string GetAppearance()
{
return base.Weapon.GetAppearance() + " 附火属性";
}
public override int GetAggressivity()
{
return base.Weapon.GetAggressivity() + 70;
}
}
public class WindDecorator : Decorator
{
public WindDecorator(Weapon w)
{
base.Weapon = w;
}
public override string GetAppearance()
{
return base.Weapon.GetAppearance() + " 附风属性属性(攻击速度加20%)";
}
public override int GetAggressivity()
{
return base.Weapon.GetAggressivity();
}
}
最后,开始创建一把普通的剑了:
public class Sword : Weapon
{
public override string GetAppearance()
{
return "这是一把剑";
}
public override int GetAggressivity()
{
return 10;
}
}
接下来试着给普通的剑附魔:
Weapon sword = new Sword();
sword.Show();
//装饰一个冰属性
sword = new GlacialDecorator(sword);
sword.Show();
//装饰一个火属性
sword = new FireDecorator(sword);
sword.Show();
//装饰一个风属性
sword = new WindDecorator(sword);
sword.Show();
输出结果:
这是一把剑 攻击力:10
这是一把剑 附冰属性 攻击力:60
这是一把剑 附冰属性 附火属性 攻击力:130
这是一把剑 附冰属性 附火属性 附风属性属性(攻击速度加20%) 攻击力:130
到此为止,装饰者模式的思想介绍完毕,当给这把普通的剑装饰上各种不同的属性时,这把普通的剑也变的不再普通,攻击力也不断上涨,还带有攻击属性,呵呵。我们还可以创建一把斧头,然后用这些装饰者装饰产生不同的效果。
欢迎大家给一些意见。