装饰者模式的实现有两个要求:
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

 看完装饰者模式你是不是想到了静态代理模式。觉得两者之间有点相似。若是你能有如此想法,那么不妨读一下本博文的静态代理模式。具体讲解两者的相同点与不同点。

posted on 2018-06-22 15:45  王衙内  阅读(119)  评论(0编辑  收藏  举报