java设计模式:装饰模式
导语:Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。下面我们来看看装饰模式,希望对大家有所帮助。
装饰模式(Decorator Pattern):
在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
特点:
(1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互
(2) 装饰对象包含一个真实对象的引用(reference)
(3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
★ 场景和问题
在不对原有对象类进行修改的基础上,如何给一个或多个已有的类对象提供增强额外的功能?
装饰模式就可以实现该功能。同时继承原有类,也能实现该功能
这里模拟实现BufferReader中的readLine()方法,模拟一个带缓存的myRead()方法,对原有的read()方法进行增速
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 | package rator.v1; import Reader; import ception; public class MyBufferedReader { private FileReader r; //封装一个对象 private char [] cbuf = new char [ 1024 ]; private int count= 0 ; //记录当前缓冲区中字符的个数 private int pos= 0 ; //数组元素的下标(当前读取的位置) public MyBufferedReader(FileReader r ){ this .r = r; } public int myRead() throws IOException { //对read()方法的'功能加强 if (count<= 0 ){ count = (cbuf); if (count==- 1 ){ return - 1 ; //代表读取到文件末尾 } pos= 0 ; } char ch = cbuf[pos]; count--; pos++; return ch; } public String myReadLine() throws IOException{ //模拟readLine()方法 StringBuilder sb = new StringBuilder(); int ch= 0 ; while ( (ch=myRead())!=- 1 ){ if (ch== '' ){ continue ; } if (ch== '' ){ return ring(); } nd(( char )ch); } if (th()!= 0 ){ return ring(); } return null ; } public void myClose() throws IOException{ e(); } } |
12345 | ?sd2332uew wekjewkjewjk dfiuewi3223 ——————————Over---------- |
测试
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | package rator.v1; import eredReader; import InputStream; import NotFoundException; import Reader; import ception; import ; public class TestMyBufferedReader { ////////////1 测试对read()的增强////////////////////// @Test public void bufferedReaderDemo() throws Exception{ //javaAPI中的类 FileReader r = new FileReader( "" ); BufferedReader br = new BufferedReader(r); int ch= 0 ; while ( (ch=())!=- 1 ){ t(( char )ch); } e(); } /* 测试结果: * ?sd2332uew * wekjewkjewjk * dfiuewi3223 * * ——————————Over---------- */ @Test public void myBufferedReaderDemo() throws Exception{ //我们自己写的类 FileReader r = new FileReader( "" ); MyBufferedReader br = new MyBufferedReader(r); int ch= 0 ; while ( (ch=ad())!=- 1 ){ t(( char )ch); } ose(); } /* 测试结果: * ?sd2332uew * wekjewkjewjk * dfiuewi3223 * * ——————————Over---------- */ ///////////2 测试对readLine()的增强///////////////////// @Test public void testBufferedReadLineDemo() throws IOException{ //javaAPI中的类 BufferedReader br = new BufferedReader( new FileReader( "" )); String str= null ; while ( (str=Line())!= null ){ tln(str); } e(); } /* 测试结果: * ?sd2332uew * wekjewkjewjk * dfiuewi3223 * * ——————————Over---------- */ @Test public void testMyBufferedReadLineDemo() throws IOException{ //我们自己写的类 MyBufferedReader br = new MyBufferedReader( new FileReader( "" )); String str= null ; while ( (str=adLine())!= null ){ tln(str); } ose(); } /* 测试结果: * ?sd2332uew * wekjewkjewjk * dfiuewi3223 * * ——————————Over---------- */ } |
-
JAVA语言的介绍及发展
Java语言是一种计算机语言,那么除此之外还有什么呢?下面是小编整理的Java语言出现的背景、影响及应用前景,欢迎阅读!一、背景最近一年多来,在Internet上出现的特别吸引人的事件就是Java语言和用Java编写的浏览器HotJava。1991年,SUNMicroSystem公司的JameGosling...
-
如何实现javascript去除字符串里中文与空格
导语:如何实现javascript去除字符串里中文与空格呢?下面是小编给大家提供的示例代码实现,大家可以参考阅读,更多详情请关注应届毕业生考试网。1.去掉空格:functionmoveSpace(){varstr="abcdefg";alert(ace(/[]/g,""));}moveSpace();2.去掉中文:vartitle="字符串zifuc...
-
Java内存溢出的解决方法
一、内存溢出类型1、fMemoryError:PermGenspaceJVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。如果webapp用了大量的第三方jar或者应用有太...
-
Java中基于Aspectwerkz的AOP开发
一、AOP编程概览面向对象编程技术进入软件开发的主流对软件的开发方式产生了极大的影响,开发者可以用一组实体以及这些实体之间的关系将系统形象地表示出来,这使得他们能够设计出规模更大、更复杂的系统,开发周期也比以前更短。OO开发的唯一问题是,它本质上是静态...