java设计模式之装饰者模式学习
Posted woqiaoxun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java设计模式之装饰者模式学习相关的知识,希望对你有一定的参考价值。
装饰者模式
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中就大量运用了包装者模式
以上是关于java设计模式之装饰者模式学习的主要内容,如果未能解决你的问题,请参考以下文章