菜鸟也疯狂之装饰者模式
装饰就和装修一样,是对现有功能进行的扩展,其含义是什么呢?也就是说即将实现的新功能是在已有功能的基础上进行的,在通俗的换句话说,新功能的执行需要先走一遍已有功能的流程。听起来很高深,实则不然,其最本质无非就是代码的复用,跟继承的功能是一样,只不过相比继承,装饰者模式可以拥有更好的灵活性,并且它是动态的进行复用代码而并非在编译器编译的时候就决定的了,咱们先上代码结尾进行阐述
public class ZhuangSZ : MonoBehaviour
{
void Start()
{
BaseAClass bac = new ConcreteBaseAClass();
Decorote dac = new DecorateAClass(bac);
dac.Handle();
}
}
/**************************************/
public abstract class BaseAClass
{
public abstract void Handle();
}
public class ConcreteBaseAClass : BaseAClass
{
public override void Handle()
{
Debug.Log("这是已有的逻辑");
}
}
/*********上边两个类是已有的功能***********/
/// <summary>
/// 装饰者的抽象类
/// </summary>
public abstract class Decorote:BaseAClass
{
private BaseAClass bac = null;
public Decorote(BaseAClass bac)
{
this.bac = bac;
}
public override void Handle()
{
if (bac == null) return;
bac.Handle();
}
}
/// <summary>
/// 具体装饰者:也就是所谓的新功能
/// </summary>
public class DecorateAClass : Decorote
{
public DecorateAClass(BaseAClass bac) : base(bac) { }
public override void Handle()
{
base.Handle();
AFuncbySelf();
}
private void AFuncbySelf()
{
Debug.Log("这是子类A的自身逻辑");
}
}
可以看到,客户端调用了dac对象当中的Handle()方法,先会执行bac对象中的Handle()方法, 然后在执行具体装饰的功能,我们称这种功能为给现有功能的扩展(原来的功能是bac.Handle(),现在通过dac.Handle()来执行,dac.Handle内部有自身的行为用来实现bac对象没有的逻辑),当然方式不止这样一种,最直白的还可以ConcreteBaseAClass类中加入新增的方法,然后在客户端进行调用,当然话扯远了,就是像这样动态的给一个对象添加上更多的功能就是装饰者设计模式的精髓所在,这里的动态是相对于编辑器模式而言的,它并不是说可以动态的修改代码从而达到新增功能,而是表明在程序中可以由程序员动态的赋予或者撤销一个对象的某些功能。好了,到此装饰者模式介绍结束,但是似乎客户端的代码调用未能体现出该模式的价值,那么请小伙伴们思考一个问题,如果此时需要在上述实例代码中新增加一个装饰bac对象的功能,那么该如何做呢?倘若你get到了,那么你应该也能想到隐藏在装饰者模式中的奥妙。