裝飾器模式(Decorator)

這裏似乎可以解釋之前的一個疑惑:

裝飾器模式與對象的適配器模式的異同:
相同點:都擁有一個目標對象
不同點:適配器模式需要實現另外一個接口,而裝飾器模式必須實現該對象的接口
換句話說,適配器模式就是把一個對象是配成另一個對象,而裝飾器模式將豐富目標對象的功能但不改變它的接口
裝飾器的核心思想

Decorator裝飾器,動態的給一個對象添加一些額外的職責
具有如下特徵:
它必須具有一個裝飾對象
它必須擁有與裝飾對象相同的接口
它可以被裝飾對象添加額外的功能
源接口:
public interface Sourcable {
public void operation();
}
源類:
public class Source implements Sourcable{
@Override
public void operation() {
// TODO Auto-generated method stub
System.out.println("原始類的方法");
}
}
裝飾器類:
public class Decorator1 implements Sourcable{
private Sourcable source;
public Decorator1(Sourcable source) {
super();
this.source = source;
}
@Override
public void operation() {
// TODO Auto-generated method stub
System.out.println("第1個裝飾器裝飾前");
source.operation();
System.out.println("第1個裝飾器裝飾後");
}
}
裝飾器類:
public class Decorator2 implements Sourcable{
private Sourcable source;
public Decorator2(Sourcable source) {
super();
this.source = source;
}
@Override
public void operation() {
// TODO Auto-generated method stub
System.out.println("第2個裝飾器裝飾前");
source.operation();
System.out.println("第2個裝飾器裝飾後");
}
}
裝飾器類:
public class Decorator3 implements Sourcable{
private Sourcable source;
public Decorator3(Sourcable source) {
super();
this.source = source;
}
@Override
public void operation() {
// TODO Auto-generated method stub
System.out.println("第3個裝飾器裝飾前");
source.operation();
System.out.println("第3個裝飾器裝飾後");
}
}
測試類 :
public class DecoratorTest {
public static void main(String[] args) {
Sourcable source=new Source();
Sourcable obj=new Decorator1(
new Decorator2(
new Decorator3(source)));
// Sourcable obj=new Decorator2(source);
obj.operation();
}
}
結果:
第1個裝飾器裝飾前
第2個裝飾器裝飾前
第3個裝飾器裝飾前
原始類的方法
第3個裝飾器裝飾後
第2個裝飾器裝飾後
第1個裝飾器裝飾後
裝飾器模式的使用及缺點:

在以下情況使用:
需要擴展一個類的功能,或者給一個類增加附加的功能
需要給一個對象增加功能,這些功能可以動態撤銷
需要增加由一些基本排列組合產生大量的功能,從而使繼承關係變得不現實
缺點:
較少的使用類,但會產生更多的對象,在進行錯誤查詢時變得更困難。


發佈了76 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章