定义
装饰者模式以对客户透明的方式动态地给一个对象附加上更多的责任,装饰者模式相比生成子类可以更灵活地增加功能。
引言
我们在软件开发中可能想给对象添加个附加功能,但是又不想去破坏此对象的结构。举个栗子,比如说你平常玩王者荣耀的普通模式,突然有一天,老板要你开发个末日模式,
但是这个活动只开1个星期,你是改原有基础好呢,还是不改原有基础好呢。
以下面栗子来说
定义一个抽象
/// <summary>
/// 游戏角色
/// </summary>
public abstract class PlayRole
{
/// <summary>
/// 普通攻击
/// </summary>
public virtual void GeneralAttack() { }
}
一个角色子类
public override void GeneralAttack()
{
base.GeneralAttack();
Console.WriteLine("赵云发出攻击");
}
具体的角色装饰类
public class Decorator: PlayRole
{
private PlayRole _play;
public Decorator(PlayRole playRole)
{
_play = playRole;
}
public override void GeneralAttack()
{
if (_play != null)
{
_play.GeneralAttack();
}
}
装饰具体类
public class Run: Decorator
{
public Run(PlayRole playRole) : base(playRole)
{
}
public override void GeneralAttack()
{
base.GeneralAttack();
Console.WriteLine("向前冲刺");
}
}
public class Sound: Decorator
{
public Sound(PlayRole playRole):base(playRole)
{
}
public override void GeneralAttack()
{
base.GeneralAttack();
Console.WriteLine("发出了声音特效");
}
}
运行
static void Main(string[] args)
{
PlayRole play = new ZhaoYun();
play.GeneralAttack();//普通攻击
play = new Sound(play);
play .GeneralAttack();//带声音
play = new Run(play );
play.GeneralAttack();//在声音的基础上向前
Console.ReadKey();
}
}
运行结果
- 抽象构件(Phone)角色:给出一个抽象接口,以规范准备接受附加责任的对象。
- 具体构件(AppPhone)角色:定义一个将要接收附加责任的类。
- 装饰(Dicorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
- 具体装饰(Sticker和Accessories)角色:负责给构件对象 ”贴上“附加的责任。
总结
- 和继承实现的功能都是一样(扩展功能)
- 把纵向继承变成了横向扩展(减少了子类爆炸的情况)
- 扩展性更高 可以随机组合你要的扩展功能
- 装饰器模式阅读性比较差