装饰设计模式 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); 转换流
这种方式在键盘输入输出中非常适用: 示例:- package unit15;
- import java.io.*;
- public class KeyboardTest {
- public static void main(String args[]){
- InputStream fis = System.in;
- StringBuilder s = new StringBuilder();
- while(true){
- try {
- int ch = fis.read();
- if(ch =='\r')
- continue;
- if(ch=='\n'){
- String str = s.toString();
- if("over".equalsIgnoreCase(str))
- break;
- System.out.println(s.toString());
- s.delete(0, s.length());//是字符串不连续显示
- }
- else
- s.append((char)ch);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- }
- }
-
-
- }
复制代码
|