深入浅析Java中的装饰器?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
动态给一个对象添加一些额外的职责,就象在墙上刷油漆。使用装饰模式相比用生成子类方式达到功能的扩充显得更为灵活。设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的只
装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为
实际上Java的I/O API就是使用装饰实现的。
//定义被装饰者 人类{公共接口 公共空间wearClothes (); 公共空间walkToWhere (); }//定义装饰者 公共抽象类装饰器实现人类{ 私人人类人类; 公共装饰(人类人类){ 这一点。人类=人类; } 公共空间wearClothes () { human.wearClothes (); } 公共空间walkToWhere () { human.walkToWhere (); } }//下面定义三种装饰,这是第一个,第二个第三个功能依次细化,即装饰者的功能越来越多 公开课Decorator_zero延伸装饰{ 公共Decorator_zero(人类人类){ 超级(人类); } 公共空间转转(){ System.out.println(“进房子。“); } 公共空间findMap () { System.out.println(“书房找找地图。“); } @Override 公共空间wearClothes () {//TODO自动生成方法存根 super.wearClothes (); 转转(); } @Override 公共空间walkToWhere () {//TODO自动生成方法存根 super.walkToWhere (); findMap (); } } 公开课Decorator_first延伸装饰{ 公共Decorator_first(人类人类){ 超级(人类); } 公共空间goClothespress () { System.out.println(“去衣柜找找看。“); } 公共空间findPlaceOnMap () { System.out.println(“在地图上找找。“); } @Override 公共空间wearClothes () {//TODO自动生成方法存根 super.wearClothes (); goClothespress (); } @Override 公共空间walkToWhere () {//TODO自动生成方法存根 super.walkToWhere (); findPlaceOnMap (); } } 公开课Decorator_two延伸装饰{ 公共Decorator_two(人类人类){ 超级(人类); } 公共空间findClothes () { System.out.println(“找到一件D& G . .“); } 公共空间findTheTarget () { System.out.println(“在地图上找到神秘花园和城堡。“); } @Override 公共空间wearClothes () {//TODO自动生成方法存根 super.wearClothes (); findClothes (); } @Override 公共空间walkToWhere () {//TODO自动生成方法存根 super.walkToWhere (); findTheTarget (); } }//定义被装饰者,被装饰者初始状态有些自己的装饰 公共类人实现人类{ @Override 公共空间wearClothes () {//TODO自动生成方法存根 System.out.println(“穿什么呢…“); } @Override 公共空间walkToWhere () {//TODO自动生成方法存根 System.out.println(“去哪里呢。“); } }//测试类,看一下你就会发现,跟java I/O的操作有多么相似 公共类测试{ 公共静态void main (String [] args) { 人类人=new (); 修饰符修饰符=new Decorator_two(新Decorator_first ( 新Decorator_zero(人))); decorator.wearClothes (); decorator.walkToWhere (); } }
运行结果:,
其实就是进房子找衣服,然后找地图这样一个过程,通过装饰者的三层装饰,把细节变得丰富。
1, Decorator抽象类中,持有人类接口,方法全部委托给该接口调用,目的是交给该接口的实现类即子类进行调用。
2, Decorator抽象类的子类(具体装饰者),里面都有一个构造方法调用超级(人类),这一句就体现了抽象类依赖于子类实现即抽象依赖于实现的原则。因为构造里面参数都是人类接口,只要是该人类的实现类都可以传递进去,即表现出装饰dt=new Decorator_second(新Decorator_first(新Decorator_zero(人类))),这种结构的样子,所以当调用dt.wearClothes (); dt.walkToWhere()的时候,又因为每个具体装饰者类中,都先调用super.wearClothes和super.walkToWhere()方法,而该超级已经由构造传递并指向了具体的某一个装饰者类(这个可以根据需要调换顺序),那么调用的即为装饰类的方法,然后才调用自身的装饰方法,即表现出一种装饰,链式的类似于过滤的行为。