java设计模式之装饰者模式学习
2016-06-06 21:25
471 查看
装饰者模式
Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案。
[b]装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为[/b]
比如现在有个方法,是过滤文字的方法
1.接口:
2.继承者
3.调用
控制台输出
现在我有个需求,我想把留言板里面的标签都给过滤了,但是我又不想把原有的方法改变。
这时,一个方法就是,在方法外面再包裹一层
1.写一个包装类,也实现MessageBoardHandler这个接口
2.再写个html标签过滤的类,继承这个包装类
3.调用
输出
加入我现在不想过滤html标签了,我想过滤一些敏感词了,这是我只要在原有的方法上包装另一个方法即可
调用,
输出
处理留言板上的内容:<a>hello</a> filter sensitive words
个人理解,其实就是在原有方法上包装一层方法,达到自己的目的,其中在java的io中就大量运用了包装者模式
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中就大量运用了包装者模式
相关文章推荐
- java那些事情
- [置顶] Java中的逆变与协变
- java连接Sql server 2008步骤
- 内部类与匿名内部类的概念与使用————Java基础知识
- spark之DataFrame 通过反射创建
- java实现多线程
- eclipse将一段代码抽取为方法Extract Method
- Spring web mvc DispatcherServlet (1)---配置
- 命令行式下java package的编译与运行注意事项
- javac找不到或无法加载主类 com.sun.tools.javac.Main
- Java 虚拟机总结 - JVM 内存区域
- SpringMVC学习笔记:Ajax与Controller的参数交互
- eclipse 快捷键
- eclipse 快捷键
- 最小Spring测试项目-04
- java09--线程
- Java 读取properties配置文件
- 最小Spring测试项目-03
- java练习——设计一个中年类(可对输入的姓名年龄进行校验)
- 最小Spring测试项目-02