设计模式之-装饰器模式
什么是装饰器模式?
在不改变原对象的基础上,通过对其进行包装扩展(添加属性或方法),使原有对象可以满足用户的更复杂需求,满足开闭原则,也不会破坏现有的操作。
装饰器模式属于结构性模式。
举例场景
emmm,我想一想,就用英雄联盟里我的本命英雄“锐雯”释放技能来举个例子吧。
游戏开始,一级学个Q,出门对线去咯,然后使用ERQ连招(简化一下不要平A了),还可以使用REQ连招......等
接下来就用代码实现一下此功能
C#代码实现
定义英雄抽象类
/// <summary>
/// 英雄
/// </summary>
public abstract class BaseHero
{
/// <summary>
/// 攻击
/// </summary>
public abstract void Spawn();
}
定义锐雯类实现英雄接口
/ /// <summary>
/// 锐雯
/// </summary>
public class RuiWenBaseHero : BaseHero
{
/// <summary>
/// 攻击
/// </summary>
public override void Spawn()
{
Console.WriteLine("来一个光速qqq");
}
}
接下来是重点,定义英雄装饰器基类
/// <summary>
/// 英雄装饰器基类
/// </summary>
public class DecoratorBaseHero : BaseHero
{
private BaseHero hreo;
public DecoratorBaseHero(BaseHero _hreo)
{
hreo = _hreo;
}
public override void Spawn()
{
hreo.Spawn();
}
}
然后继承装饰器基类为锐雯实现一个E技能
/// <summary>
/// 使用E技能(勇往直前)
/// </summary>
public class ERuiWenHeroDecorator : DecoratorBaseHero
{
public ERuiWenHeroDecorator(BaseHero hreo) : base(hreo)
{
}
public override void Spawn()
{
base.Spawn();
Console.WriteLine("E勇往直前,挡一下伤害");
}
}
再来一个R技能吧
/// <summary>
/// 使用R技能(放逐之锋)
/// </summary>
public class RRuiWenHeroDecorator : DecoratorBaseHero
{
public RRuiWenHeroDecorator(BaseHero hreo) : base(hreo)
{
}
public override void Spawn()
{
base.Spawn();
Console.WriteLine("开R,秒人");
}
}
最后来使用一下连招 QWER
class Program
{
static void Main(string[] args)
{
//初始化锐雯
BaseHero hero = new RuiWenBaseHero();
//使用装饰器叫锐雯 使出w技能
hero = new WRuiWenHeroDecorator(hero);
//使用装饰器叫锐雯 使出e技能
hero = new ERuiWenHeroDecorator(hero);
//使用装饰器叫锐雯 使出w技能
hero = new RRuiWenHeroDecorator(hero);
hero.Spawn();
Console.ReadKey();
}
}
运行结果
还可以随意组合 比如使出QREW 改变顺序即可
class Program
{
static void Main(string[] args)
{
//初始化锐雯
BaseHero hero = new RuiWenBaseHero();
hero = new RRuiWenHeroDecorator(hero);
hero = new ERuiWenHeroDecorator(hero);
hero = new WRuiWenHeroDecorator(hero);
hero.Spawn();
Console.ReadKey();
}
}