装饰设计么模式

装饰设计模式

1.装饰设计模式:

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

       如:BufferedStream(InputStream in);

        BufferedStream是基于InputStream的装饰类。

 

2、装饰和继承的区别:

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

package unit15;

import java.io.*;

class MyLineNumberReader extends MyBufferedReader{//装饰类
	private Reader r;
	private int lineNumber;

	MyLineNumberReader(Reader r) {//根据多态思想,使用Reader作为参数对象类
		super(r);
		
	}
	public String MyLineNumberReaderLine() throws IOException{
		     lineNumber++;
		
		     return super.MyReadLine();		
	}
	public void setLineNumber(int lineNumber){
		this.lineNumber = lineNumber;
	}
	public int getLineNumber(){
		return lineNumber;
	}
	public void myClose() throws IOException{
		r.close();
	}
}


public class MyLineNumberTest {
	public static void main(String args[]){
		
		try {
			FileReader fr = new FileReader("src/unit15/FileWriterTest.java");
			MyLineNumberReader mlr = new MyLineNumberReader(fr);
			String str = null;
			while((str=mlr.MyLineNumberReaderLine())!=null){
				System.out.println(str);
			}
			mlr.MyClose();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		
	}

}

  

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

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

 

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

示例:

 

 1 package unit15;
 2 
 3 import java.io.*;
 4 
 5 public class TransfreamTest {
 6     public static void main(String args[]){
 7        // InputStream in = System.in;
 8         //InputStreamReader isr = new InputStreamReader(in);
 9        // BufferedReader bfr = new BufferedReader(isr);
10         BufferedReadser buf = new BufferedReader(new InputSream(System.in));//键盘输入组合格式
11        // OutputStream out = System.out;
12        // OutputStreamWriter osw = new OutputStreamWriter(out);
13        // BufferedWriter brw = new BufferedWriter(osw);
14         BufferedWriter bfw = new BufferedWriter(new OutputSteam(System.out));//输出到控制台
15         
16         String str = null;
17         try {
18             while((str=bfr.readLine())!= null){
19                 if("over".equals(str))
20                     break;
21                 //System.out.println(str);
22                 brw.write(str);
23                 brw.newLine();
24                 brw.flush();
25                 
26             }
27             bfr.close();
28             brw.close();
29         } catch (IOException e) {
30             // TODO Auto-generated catch block
31             e.printStackTrace();
32         }
33             
34     }
35 
36 }

 

posted @ 2015-06-29 18:17  池中月  阅读(156)  评论(0编辑  收藏  举报