A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 池中月 中级黑马   /  2015-7-5 18:12  /  599 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

装饰设计模式

1.装饰设计模式:

  • 当想要对已有对象功能增强是,可以定义类,将已有对象传入;基于已有对象的功能,并提供增强功能,那么定义的类称为装饰类;
  • 装饰类通常会通过构造函数接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能;

       如:BufferedStream(InputStream in);

        BufferedStream是基于InputStream的装饰类。


2、装饰和继承的区别:

  • 装饰模式比继承模式跟灵活,避免了继承体系的臃肿,而且降低了类与类之间的联系;
  • 装饰类因为增强了已有对象,具备的功能和已有的相同,只不过提供了更强的功能;所以,装饰类和被装饰类通常属于同以体系;


  1. *
  2. * 自定义一个带行号的装饰类MyLineNumberReader
  3. */

  4. package unit15;

  5. import java.io.*;

  6. class MyLineNumberReader extends MyBufferedReader{
  7.         private Reader r;
  8.         private int lineNumber;

  9.         MyLineNumberReader(Reader r) {//根据多态思想,使用Reader作为参数对象类
  10.                 super(r);
  11.                
  12.         }
  13.         public String MyLineNumberReaderLine() throws IOException{
  14.                      lineNumber++;
  15.                
  16.                      return super.MyReadLine();               
  17.         }
  18.         public void setLineNumber(int lineNumber){
  19.                 this.lineNumber = lineNumber;
  20.         }
  21.         public int getLineNumber(){
  22.                 return lineNumber;
  23.         }
  24.         public void myClose() throws IOException{
  25.                 r.close();
  26.         }
  27. }


  28. public class MyLineNumberTest {
  29.         public static void main(String args[]){
  30.                
  31.                 try {
  32.                         FileReader fr = new FileReader("src/unit15/FileWriterTest.java");
  33.                         MyLineNumberReader mlr = new MyLineNumberReader(fr);
  34.                         String str = null;
  35.                         while((str=mlr.MyLineNumberReaderLine())!=null){
  36.                                 System.out.println(str);
  37.                         }
  38.                         mlr.MyClose();
  39.                        
  40.                 } catch (IOException e) {
  41.                         // TODO Auto-generated catch block
  42.                         e.printStackTrace();
  43.                 }

  44.                
  45.         }

  46. }
复制代码

3、装饰设计模式的应用在IO输入/输出中最常见,其中有两个比较重要:

  • InputStreamReader(InputStream in);
  • OutputSteamWriter(OutputStream out);  转换流

这种方式在键盘输入输出中非常适用:

示例:

  1. package unit15;
  2. import java.io.*;

  3. public class KeyboardTest {
  4.         public static void main(String args[]){
  5.                 InputStream fis = System.in;
  6.                 StringBuilder s = new StringBuilder();
  7.                 while(true){
  8.                         try {
  9.                                 int ch = fis.read();
  10.                                 if(ch =='\r')
  11.                                         continue;
  12.                                 if(ch=='\n'){
  13.                                         String str = s.toString();
  14.                                         if("over".equalsIgnoreCase(str))
  15.                                                 break;
  16.                                         System.out.println(s.toString());
  17.                                         s.delete(0, s.length());//是字符串不连续显示
  18.                                 }               
  19.                                 else
  20.                                         s.append((char)ch);
  21.                         } catch (IOException e) {
  22.                                 // TODO Auto-generated catch block
  23.                                 e.printStackTrace();
  24.                         }
  25.                        
  26.                 }
  27.         }
  28.        
  29.        
  30. }
复制代码




1 个回复

倒序浏览
....................................
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马