(1)裝飾模式定義
動態的給一個對象添加一些額外的職責
(2)應用裝飾模式來解決的思路
雖然經過簡化,業務簡單了很多,但是需要解決的問題不會少,還是要解決:要透明的給一個對象增加功能,並實現功能的動態組合。
所謂透明的給一個對象增加功能,換句話說就是要給一個對象增加功能,但是不能讓這個對象知道,也就是不能去改動這個對象。而實現了能夠給一個對象透明的增加功能,自然就能夠實現功能的動態組合,比如原來的對象有A功能,現在透明的給它增加了一個B功能,是不是就相當於動態組合了A和B功能呢。
在裝飾模式的實現中,爲了能夠和原來使用被裝飾對象的代碼實現無縫結合,是通過定義一個抽象類,讓這個類實現與被裝飾對象相同的接口,然後在具體實現類裏面,轉調被裝飾的對象,在轉調的前後添加新的功能,這就實現了給被裝飾對象增加功能,這個思路跟“對象組合”非常類似。在轉調的時候,如果覺得被裝飾的對象的功能不再需要了,還可以直接替換掉,也就是不再轉調,而是在裝飾對象裏面完全全新的實現。
代碼示例:
/**
*一個接口,一個抽象方法
*/
publicinterfacePerson{
publicvoidsayMsg();
}
/**
*需要被裝飾的對象
*/
publicclassStudentimplementsPerson{
publicvoidsayMsg(){
System.out.println("Helloeveryone!");
}
}
/**
*裝飾器
*/
publicclassDecoratorimplementsPerson{
//需要裝飾的對象
privatePersonperson;
/**
*通過構造方法把要裝飾的對象傳進來
*/
publicDecorator(Personperson){
this.person=person;
}
publicvoidsayMsg(){
/**
*在相同的方法上,添加額外的邏輯
*/
System.out.println("先記一下日誌");
person.sayMsg();
System.out.println("然後再記錄");
}
}
//測試
publicclassTest{
publicstaticvoidmain(String[]args){
Personstudent=newDecorator(newStudent());
//student=newDecorator(student);
student.sayMsg();
}
}