装饰者模式的实现有两个要求:
1.装饰者类与目标类要实现相同的借口,或者继承自相同的抽象类。2.装饰者类中要有目标类的引用作为成员变量,具体的赋值一般通过带参构造器完成。按着这两个要求我们进行类的编写。
目标类:
//接口package com.wk.decorator;public interface IMyService { String sayHello();}//实现类package com.wk.decorator;public class IMyServiceImpl implements IMyService { @Override public String sayHello() { return "hello"; }}
装饰者基类
package com.wk.decorator;//装饰者基类:不对目标类进行增强 ,无参构造,目标对象引用public class DecoratorBase implements IMyService { protected IMyService target; public DecoratorBase() { super(); } public DecoratorBase(IMyService target) { this.target = target; } @Override public String sayHello() { //调用目标方法 不增强。 return target.sayHello(); }}
具体装饰者类
//具体装饰者类1package com.wk.decorator;//具体装饰类:继承基类,单一增强。有参构造。public class WhoSay extends DecoratorBase { public WhoSay(IMyService target) { super(target); } //重写基类业务方法 增强。 @Override public String sayHello() { return "Jack say " +super.sayHello(); }}//具体装饰者类2package com.wk.decorator;public class toWho extends DecoratorBase { public toWho(IMyService target) { super(target); } @Override public String sayHello() { // TODO Auto-generated method stub return super.sayHello()+" to Tom"; }}
测试:
package com.wk.decorator;public class Test { public static void main(String[] args) { //创建目标对象 IMyService target=new IMyServiceImpl(); //使用目标对象作为参数,创建装饰者类 IMyService who=new WhoSay(target); String one=who.sayHello(); System.out.println(one); //将第一次增强的结果作为第二次增强的参数出现,形成“装饰者链” IMyService towho=new toWho(who); String two=towho.sayHello(); System.out.println(two); }}
测试结果:
Jack say helloJack say hello to Tom
看完装饰者模式你是不是想到了静态代理模式。觉得两者之间有点相似。若是你能有如此想法,那么不妨读一下本博文的静态代理模式。具体讲解两者的相同点与不同点。