裝飾着設計模式:
BufferedReader拓展了FileReader的功能。
BufferedWriter拓展了FileWriter的功能。
需求1: 編寫一個類拓展BufferedReader的功能, 增強readLine方法返回 的字符串帶有行號。
需求2:編寫一個類拓展BufferedReader的功能, 增強readLine方法返回 的字符串帶有分號。
需求3: 編寫一個類拓展BufferedReader的功能, 增強readLine方法返回 的字符串帶有雙引號。
需求4: 編寫一個類拓展BufferedReader的功能, 增強readLine方法返回 的字符串帶有行號+ 分號。
需求5: 編寫一個類拓展BufferedReader的功能, 增強readLine方法返回 的字符串帶有分號+ 雙引號。
需求6: 編寫一個類拓展BufferedReader的功能, 增強readLine方法返回 的字符串帶有雙引號+ 行號。
需求7: 編寫一個類拓展BufferedReader的功能, 增強readLine方法返回 的字符串帶有行號+ 分號+雙引號。
裝飾者設計模式的步驟:
1.在裝飾類的內部維護一個被裝飾類的引用。
2.在裝飾類有一個共同的父類或者是父接口。
繼承實現的增強類和修飾模式實現的增強類有何區別?
繼承實現的增強類:
優點:代碼結構清晰而且實現簡單
缺點:對於每一個需要增強的類都要創建具體的子類來幫助其增強,這樣會導致繼承體系過於龐大。
修飾模式實現的增強類:
優點:內部可以通過多態技術對多個需要增強的類進行增強,可以是這些裝飾類達到互相裝飾的效果。使用比較靈活。
缺點:需要內部通過多態技術維護需要被增強的類的實例。進而使得代碼稍微複雜。
需求具體代碼:
package net.nyist;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class Demo5 {
public static void main(String[] args) throws IOException {
File file = new File("E:\\Learning materials\\JAVA\\day21\\代碼\\day21\\src\\other\\Demo1.java");
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
BufferedLineNum bufferedLineNum = new BufferedLineNum(bufferedReader);
BufferedSemicolon bufferedSemicolon = new BufferedSemicolon(bufferedLineNum);
Bufferedquotation bufferedquotation = new Bufferedquotation(bufferedSemicolon);
String line = null;
while((line = bufferedquotation.readLine())!=null){
System.out.println(line);
}
}
}
//帶行號緩衝輸入字符流
class BufferedLineNum extends BufferedReader{
//在內部維護一個被裝飾的引用
BufferedReader bufferedReader;
int count = 1;
public BufferedLineNum(BufferedReader bufferedReader) {
super(bufferedReader);
this.bufferedReader = bufferedReader;
}//該語句沒有任何的作用,只不過是爲了不讓代碼不報錯
public String readLine() throws IOException{
String line = bufferedReader.readLine();
if(line == null){
return null;
}
line = count+" "+line;
count++;
return line;
}
}
class BufferedSemicolon extends BufferedReader{
BufferedReader bufferedReader;
public BufferedSemicolon(BufferedReader bufferedReader) {
super(bufferedReader);
this.bufferedReader = bufferedReader;
}
public String readLine() throws IOException{
String line = bufferedReader.readLine();
if(line == null){
return null;
}
line = line +";";
return line;
}
}
class Bufferedquotation extends BufferedReader{
BufferedReader bufferedReader;
public Bufferedquotation(BufferedReader bufferedReader) {
super(bufferedReader);
this.bufferedReader = bufferedReader;
}
public String readLine() throws IOException{
String line = bufferedReader.readLine();
if(line == null){
return null;
}
line = "\""+line+"\"";
return line;
}
}