java语言 百分网手机站

java设计模式:装饰模式

时间:2020-09-11 11:13:38 java语言 我要投稿

java设计模式:装饰模式

  导语:Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。下面我们来看看装饰模式,希望对大家有所帮助。

  装饰模式(Decorator Pattern):

  在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

  特点:

  (1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互

  (2) 装饰对象包含一个真实对象的引用(reference)

  (3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。

  (4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

  ★ 场景和问题

  在不对原有对象类进行修改的基础上,如何给一个或多个已有的类对象提供增强额外的功能?

  装饰模式就可以实现该功能。同时继承原有类,也能实现该功能

  这里模拟实现BufferReader中的readLine()方法,模拟一个带缓存的.myRead()方法,对原有的read()方法进行增速

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package cn.hncu.pattern.decorator.v1;          
import java.io.FileReader;          
import java.io.IOException;          
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 = r.read(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 sb.toString();          
           }          
                     
           sb.append((char)ch);          
       }          
       if(sb.length()!=0){          
           return sb.toString();          
       }          
       return null;          
   }          
             
   public void myClose() throws IOException{          
       r.close();          
   }          
             
}          

  a.txt

1
2
3
4
5
?sd2332uew          
wekjewkjewjk          
dfiuewi3223          
——————————Over----------          

  测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package cn.hncu.pattern.decorator.v1;          
import java.io.BufferedReader;          
import java.io.DataInputStream;          
import java.io.FileNotFoundException;          
import java.io.FileReader;          
import java.io.IOException;          
import org.junit.Test;          
public class TestMyBufferedReader {          
             
   ////////////1 测试对read()的增强//////////////////////          
             
   @Test          
   public void bufferedReaderDemo() throws Exception{          
       //javaAPI中的类          
       FileReader r = new FileReader("a.txt");          
       BufferedReader br = new BufferedReader(r);          
       int ch=0;          
       while( (ch=br.read())!=-1){          
           System.out.print((char)ch);          
       }          
       br.close();          
   }          
   /* 测试结果:          
    * ?sd2332uew          
    * wekjewkjewjk          
    * dfiuewi3223          
    *          
    * ——————————Over----------          
    */          
   @Test          
   public void myBufferedReaderDemo() throws Exception{          
       //我们自己写的类          
       FileReader r = new FileReader("a.txt");          
       MyBufferedReader br = new MyBufferedReader(r);          
       int ch=0;          
       while( (ch=br.myRead())!=-1){          
           System.out.print((char)ch);          
       }          
       br.myClose();          
   }          
   /* 测试结果:          
    * ?sd2332uew          
    * wekjewkjewjk          
    * dfiuewi3223          
    *          
    * ——————————Over----------          
    */          
             
   ///////////2 测试对readLine()的增强/////////////////////          
   @Test          
   public void testBufferedReadLineDemo() throws IOException{          
       //javaAPI中的类          
       BufferedReader br =new BufferedReader( new FileReader("a.txt"));          
       String str=null;          
       while( (str=br.readLine())!=null ){          
           System.out.println(str);          
       }          
       br.close();          
   }          
   /* 测试结果:          
    * ?sd2332uew          
    * wekjewkjewjk          
    * dfiuewi3223          
    *          
    * ——————————Over----------          
    */          
   @Test          
   public void testMyBufferedReadLineDemo() throws IOException{          
       //我们自己写的类          
       MyBufferedReader br =new MyBufferedReader( new FileReader("a.txt"));          
       String str=null;          
       while( (str=br.myReadLine())!=null ){          
           System.out.println(str);          
       }          
       br.myClose();          
   }          
   /* 测试结果:          
    * ?sd2332uew          
    * wekjewkjewjk          
    * dfiuewi3223          
    *          
    * ——————————Over----------          
    */          
}          

【java设计模式:装饰模式】相关文章:

JAVA设计模式之单例模式11-23

解析Java的设计模式编程之解释器模式的运用11-23

Java的设计模式编程中责任链模式的运用的实例讲解12-01

该怎么使用Java设计模式编程中的OCP开闭原则?11-23

简单讲解Java的Future编程模式方案11-25

Java开发策略模式的简单应用实现方法11-30

PHP中的设计模式详解08-15

C语言编程中使用设计模式中的原型模式的讲解11-19

photoshop柔光模式和叠加模式的运用教程11-15

海关通关作业新模式11-12