装饰者模式

Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案。

装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为

 

比如现在有个方法,是过滤文字的方法

1.接口:

package com.qiao.wrapper;

public interface MessageBoardHandler {
    public String filter(String msg);
}

2.继承者

package com.qiao.wrapper;

public class MessageBoard implements MessageBoardHandler{

    public String filter(String msg) {
        return "处理留言板上的内容:"+msg;
    }

}

3.调用

@Test
public void test4(){
  MessageBoardHandler hanlder = new MessageBoard();
  String msg = hanlder.filter("<a>hello</a>");
  System.out.println(msg);
}

控制台输出

 

 

现在我有个需求,我想把留言板里面的标签都给过滤了,但是我又不想把原有的方法改变。

这时,一个方法就是,在方法外面再包裹一层

1.写一个包装类,也实现MessageBoardHandler这个接口

package com.qiao.wrapper;

public abstract class MessageBoardDecorator implements MessageBoardHandler{

    private MessageBoardHandler handler;
    
    public MessageBoardDecorator(MessageBoardHandler hanlder){
        this.handler=hanlder;
    }
    
    public String filter(String msg) {
        return this.handler.filter(msg);
    }

}

 

2.再写个html标签过滤的类,继承这个包装类

package com.qiao.wrapper;

public class HtmlFilter extends MessageBoardDecorator {

    private MessageBoardHandler hanlder;
    
    public HtmlFilter(MessageBoardHandler hanlder) {
        super(hanlder);
        this.hanlder=hanlder;
    }
    
    public String filter(String msg){
        String temp = this.hanlder.filter(msg);
        temp+=" ^^^Filter html tag";
        return temp;
    }

}

 

3.调用

    @Test
    public void test5(){
        MessageBoardDecorator dec = new HtmlFilter(new MessageBoard());
        String msg = dec.filter("<a>hello</a>");
        System.out.println(msg);
    }

 输出

 

加入我现在不想过滤html标签了,我想过滤一些敏感词了,这是我只要在原有的方法上包装另一个方法即可

package com.qiao.wrapper;

public class SensitiveFilter extends MessageBoardDecorator {

    private MessageBoardHandler hanlder;
    
    public SensitiveFilter(MessageBoardHandler hanlder) {
        super(hanlder);
        this.hanlder = hanlder;
    }

    public String filter(String msg){
        String temp = this.hanlder.filter(msg);
        temp += " filter sensitive words ";
        return temp;
    }
}

 

 调用,

    @Test
    public void test6(){
        MessageBoardDecorator dec = new SensitiveFilter(new MessageBoard());
        String msg = dec.filter("<a>hello</a>");
        System.out.println(msg);
    }

 

输出

 

  处理留言板上的内容:<a>hello</a> filter sensitive words

 

个人理解,其实就是在原有方法上包装一层方法,达到自己的目的,其中在java的io中就大量运用了包装者模式

 

posted on 2016-06-06 21:25  woqiaoxun  阅读(204)  评论(0编辑  收藏  举报