装饰者模式的实现有两个要求:
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(); } }
具体装饰者类
//具体装饰者类1 package com.wk.decorator; //具体装饰类:继承基类,单一增强。有参构造。 public class WhoSay extends DecoratorBase { public WhoSay(IMyService target) { super(target); } //重写基类业务方法 增强。 @Override public String sayHello() { return "Jack say " +super.sayHello(); } } //具体装饰者类2 package 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 hello Jack say hello to Tom
看完装饰者模式你是不是想到了静态代理模式。觉得两者之间有点相似。若是你能有如此想法,那么不妨读一下本博文的静态代理模式。具体讲解两者的相同点与不同点。