在客户端脚本中,有一个类通常有一个方法需要执行一些操作,当我们需要扩展新功能,增加一些操作代码时,通常需要修改类中方法的代码,这种方式违背了开闭的原则。
装饰器模式可以动态的给类增加一些额外的职责。基本实现思路是:定义一个装饰类,这个装饰类来装饰新的功能,将新的功能代码移植到继承装饰类的子类中,而这个子类先
调用装饰类的方法,紧接着实现自己的新功能,最后在客户端去显示装饰要调用哪些功能。代码如下:
interface IPeople{ do():void; } class People implements IPeople{ public do():void{ console.log("Eat"); } } class DecoratorPeople { protected people:IPeople; public SetPeople(ipeople:IPeople):void{ this.people=ipeople; } public do():void{ if(this.people){ this.people.do(); } } } class ProgrammerPeople extends DecoratorPeople { public do():void{ super.do(); console.log("Coding"); } } class TesterPeople extends DecoratorPeople{ public do():void{ super.do(); console.log("Testing"); } } var p=new People(); var pp=new ProgrammerPeople(); var tp=new TesterPeople(); pp.SetPeople(p); tp.SetPeople(pp); tp.do();
解释:
People中的方法是原始的一个基础实现,ProgrammerPeople与TestPeople两个从装饰类继承的子类是后期新功能的实现。
在pp对象SetPeople(p)时,就将p传入了装饰类,tp对象SetPeople(pp)时,就将pp传入了装饰类,最后在调用tp.do方法时,就要逐级先执行上级传入的对象
的do方法,从而实现了功能的扩展。
欢迎加入QQ群讨论:573336726