装饰者模式
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.调用
@Testpublic 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.调用
@Testpublic 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;}}
调用,
@Testpublic 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中就大量运用了包装者模式