装饰者:包装
为某些对象动态附加功能
使用派生可以扩展一个类的行为,但是无法单独扩展某个或者某些对象的行为,在类的设计上采用装饰者模式可以实现对某个对象扩展功能。
比如:在ARPG中,武器和装饰物就采用该模式扩展了武器的行为,比如剑上镶嵌一颗宝石使得宝剑在基础攻击功能上增加使敌人产生眩晕效果,你可能会想只要在剑的类中添加一个眩晕方法不就行了吗,但是这样做后,所有剑的实例对象都具备了眩晕功能,这并不是我们想要的,我们只是想单独给某个对象添加眩晕功能,你可能会说对装饰物派生一个宝石宝剑类,这样宝石宝剑类的实例化对象就具备了眩晕功能,这样就会造成一些排列组合成的类,因为装饰物是多种多样的,会有红宝石宝剑类,蓝宝石宝剑类,如果武器有刀,就会还要红宝石刀类,蓝宝石刀类,大量的排序组合类使得代码难以维护。泛化(继承)可以扩展一个类的功能,不要忘了组合一样可以扩展功能,面向对象的原则就是优先使用组合而非继承。装饰者模式就是同时使用了继承和组合来扩展武器的功能。
代码:
public abstract class Weapon
{
public abstract void Attack ();
}
public class Sword:Weapon
{
public override void Attack ()
{
Debug.Log ("剑普攻");
}
}
public abstract class Decorator:Weapon
{
private Weapon m_Weapon;
public Decorator(Weapon weapon)
{
m_Weapon = weapon;
}
public override void Attack ()
{
m_Weapon.Attack ();
}
}
public class RedDiamond:Decorator
{
public RedDiamond(Weapon weapon):base(weapon){}
public override void Attack ()
{
base.Attack ();
Dizziness ();
}
private void Dizziness()
{
Debug.Log ("眩晕");
}
}
public class BlueDiamond:Decorator
{
public BlueDiamond(Weapon weapon):base(weapon){}
public override void Attack ()
{
base.Attack ();
Frozen ();
}
private void Frozen()
{
Debug.Log ("冰冻");
}
}
public class DecoratorTest : MonoBehaviour
{
private void Start ()
{
Weapon sword = new Sword ();
sword.Attack ();
print ("----------------------");
sword = new RedDiamond (sword);
sword.Attack ();
print ("----------------------");
sword = new BlueDiamond (sword);
sword.Attack ();
}
}
这样如果再出现装饰的派生类或者武器的派生类都可以很好的扩展
public class Digger:Weapon
{
public override void Attack ()
{
Debug.Log ("匕首普攻");
}
}
public class YellowDiamond:Decorator
{
public BlueDiamond(Weapon weapon):base(weapon){}
public override void Attack ()
{
base.Attack ();
Poisoning();
}
private void Poisoning()
{
Debug.Log ("中毒");
}
}
public class DecoratorTest : MonoBehaviour
{
private void Start ()
{
Weapon sword = new Digger();
sword.Attack ();
print ("----------------------");
sword = new YellowDiamond (sword);
sword.Attack ();
}
}
这是就会发现武器单独一个分支派生,装饰者单独一个分支派生,当然装饰者在这里继承了武器是为了更好得使接口统一。这里我们就单独给一个剑或者匕首扩展了其行为。
总结:
1.装饰者是对一个对象动态扩展原有的行为能力,不断包装,不断的扩展;
2.动态地给一个对象添加一些额外的职责。就增加功能来说, D e c o r a t o r模式相比派生成子类更为灵活;