写在前头:希望你了解到的不仅是模式,而学会用OOP的眼光分析问题,解决问题。
关键字:允许向一个现有的对象添加新的功能,同时又不改变其结构。
描述::通过实现相同的接口(保证行为相同)跟组合,实现对方法的增强;是继承的一个替代模式,之所以使用装饰器,不使用继承,也是对OCP和优先使用合成而非继承原则的遵守。
原则:开放封闭(OCP),优先使用合成而非继承,单一职责原则。
区别:代理模式强调的是对实际对象的控制,是客户对象与实际对象增加一个中间层。装饰者像是给实际对象的套上了一个壳子,使其一些功能得到了增强与升级。
示例:不同皮肤的英雄
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| public interface Hero { public void skin(); }
public class GLun implements Hero { public GLun() {}; @Override public void skin() { System.out.println("Hero is origin skin!"); } }
public abstract class HeroDecorator implements Hero { protected Hero hero; public HeroDecorator(Hero hero) { this.hero = hero; } }
public class GLun_legend extends HeroDecorator {
public GLun_legend(Hero hero) { super(hero); } @Override public void skin() { setLegendSkin(hero); } private void setLegendSkin(Hero hero) { System.out.println("Hero is updated to legendSkin!"); } public static void main(String[] args) { Hero glun= new GLun(); glun.skin(); System.out.println(); Hero glun1= new GLun_legend(new GLun()); glun1.skin(); } }
|