裝飾設計模式: 就是對想要的類功能進行加強…
例如: FileWriter
與 BufferedWriter
BufferedWriter就是用的裝飾模式對FileWriter的功能進行增強. 效率的增強.
不僅如此…裝飾設計模式還有解耦的作用
裝飾和繼承都能實現一樣的特點: 進行功能的擴展增強
但是繼承耦合性會大…並且後面很能解耦
裝飾設計模式例子:
人在以前只有飯吃…
public class Demo {
public static void main(String[] args) {
Person p = new Person();
p.chifan();
}
}
class Person {
void chifan() {
System.out.println("吃飯");
}
}
運行結果:
現在生活好了…能吃的東西也變多了…
我們可以對吃飯這個功能利用裝設設計模式進行加強
public class Demo {
public static void main(String[] args) {
Person p = new Person();
//p.chifan();
NewPerson np = new NewPerson(p);
np.chifan();
}
}
class Person {
void chifan() {
System.out.println("吃飯");
}
}
class NewPerson {
private Person p;
NewPerson(Person p) {
this.p = p;
}
void chifan() {
System.out.println("開胃酒");
p.chifan();
System.out.println("甜點");
}
}
運行結果:
如果用繼承話…
public class Demo {
public static void main(String[] args) {
NewPerson p = new NewPerson();
p.chifan();
}
}
class Person {
void chifan() {
System.out.println("吃飯");
}
}
class NewPerson extends Person{
void chifan() {
System.out.println("開胃酒");
super.chifan();
System.out.println("甜點");
}
}
運行結果也是和剛剛用裝飾設計模式一樣的
假設我們用操作文件的例子(類什麼的都是虛構的)
Writer
|-- TextWriter: 用於操作文本
|--BufferTextWriter: 加入了緩衝技術的操作文本的對象
|-- MediaWriter: 用於操作媒體
|--BufferMediaWriter: 加入了緩衝技術的操作媒體的對象
到這裏就已經可以了. 但是這樣做好像並不理想.
我們發現只爲提高功能. 進行繼承. 導致繼承體系越來越臃腫. 不夠靈活
這一種是讓緩衝和具體的對象相結合.
我們將緩衝進行單獨的封裝, 那個對象需要緩衝就將那個對象和緩衝關聯
就想FileWriter
與 BufferedWriter
一樣
所以裝飾比繼承靈活.
特點: 裝飾類和被裝飾類都必須所屬同一個接口或者父類