一、裝飾設計模式:
當想要對已有的物件進行功能增強時,可以定義類,將已有物件傳入,基於已有功能,提供加強功能。
那麼自定義的類稱為裝飾類。
例子:對人吃飯這一功能進行增強
class person
}
class superperson
public void supereat()
}
class persondemo
}
由該例可知,裝飾類通常會通過構造方法接受被裝飾的物件,並基於被裝飾的物件的功能,提供更強的功能。
二、裝飾與繼承的區別:
myreader//專門用於讀取資料的類。
|——mytextreader
|——mybuffertextreader
|——mymediareader
|——mybuffermediareader
|——mydatareader
|——mybufferdatareader
class mybufferreader
mybufferreader(mymediareader medi)
{}
}
上面這個類擴充套件性很差。
找到其引數的共同型別,通過多型的形式,可以提高擴充套件性。
class mybufferreader extends myreader
}
myreader//專門用於讀取資料的類。
|——mytextreader
|——mymediareader
|——mydatareader
|——mybufferdatareader
裝飾模式比繼承要靈活,避免了繼承體系的臃腫,而且降低了類與類之間的關係。
裝飾類因為增強已有物件,具備的功能和已有的是相同的,只不過提供了更強的功能,所以裝飾類和被裝飾類通常是都屬於乙個體系的。
三、io中的裝飾設計模式:
例子:模擬乙個帶行號的緩衝區物件。
class mylinenumberreader
public string myreadline() throws exception
if(sb.length()!=0)
return sb.tostring();
return null;
}
public void setlinenumber(int linenumber)
public int getlinenumber()
public void myclose()throws ioexception
}
class mylinenumberreaderdemo
mylnr.myclose();
}
}
裝飾設計模式解決:對一組類進行功能的增強。
包裝:寫乙個類(
包裝類)
對被包裝物件進行包裝;
1、包裝類和被包裝物件要實現同樣的介面;
2、包裝類要持有乙個被包裝物件;
3、包裝類在實現介面時,大部分方法是靠呼叫被包裝物件來實現的,對於需要修改的方法我們自己實現
java基礎學習之裝飾設計模式
在學習io流的時候,使用底層的基礎的輸入輸出流 inputstream outputstream和reader writer 進行讀寫操作的時候,我們一般會使用bufferinputstream bufferoutputstream和bufferreader bufferwriter進行包裝。pub...
設計模式學習總結 裝飾模式
抽象構件角色 component 給出乙個抽象介面,以規範準備接收附加責任的物件。具體構件角色 concrete component 定義乙個將要接收附加責任的類。裝飾角色 decorator 持有乙個構件 component 物件的引用,並定義乙個與抽象構件介面一致的介面。具體裝飾角色 concr...
設計模式學習總結 8 裝飾模式
8.裝飾模式 意圖 動態地給乙個物件新增一些額外的職責。就增加功能來說,decorator模式相比生成子類更為靈活。主要解決 一般的,我們為了擴充套件乙個類經常使用繼承方式實現,由於繼承為類引入靜態特徵,並且隨著擴充套件功能的增多,子類會很膨脹 什麼時候使用 在不想增加很多子類的情況下擴充套件類 如...