您的位置:首页 > 编程语言 > Java开发

java设计模式之装饰者模式学习

2016-06-06 21:25 471 查看
装饰者模式

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

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

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

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中就大量运用了包装者模式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: