生活随笔
收集整理的這篇文章主要介紹了
Java设计模式之装饰模式(透明装饰模式,半透明装饰模式)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、概述
動態地給一個對象增加一些額外的職責(方法)。就擴展功能而言,裝飾者模式提供了一種比使用子類更加靈活的替代方案。
裝飾模式是一種用于替代繼承的技術,它通過一種無須定義子類的方式給對象動態增加職責,使用對象之間的關聯關系取代類之間的繼承關系。
二、結構與實現
結構
(1)Component(抽象構件):
是具體構件類和抽象裝飾者類的共同父類。
(2)ConcreteComponent(具體構件類):
抽象構件的子類,裝飾者類可以給它增加額外的職責。
(3)Decorator(抽象裝飾類):
抽象構件的子類,具體裝飾類的父類,用于給具體構件增加職責,但在子類中實現。它維護一個指向抽象構件對象的引用,通過該引用可以調用裝飾之前構件對象的方法,并通過其子類擴展該方法,以達到裝飾的目的。
(4)ConcreteDecorator(具體裝飾類):
負責向構件添加新的職責。每一個具體裝飾類都定義了一些新的行為,它可以調用在抽象裝飾類中定義的方法。
實現
abstract class Component{abstract void operation();
}class ConcreteComponent extends Component{void operation(){}
}class Decorator extends Component{private Component component
;public Decorator(Component component
){this.component
=component
;}public void operation(){component
.operation(); }
}class ConcreteDecorator extends Decorator{public ConcreteDecorator(Component component
){super(component
);}public void operation(){super.operation();addedBehavior();}public void addedBehavior(){}
}
三、應用案例
分析
窗體、文本框、列表框為具體構件類,滾動條、黑色邊框為具體裝飾類。
類圖
實現
abstract class Component {public abstract void display();
}
class ListBox extends Component {@Overridepublic void display() {System
.out
.println("顯示列表框...");}
}
class TextBox extends Component {@Overridepublic void display() {System
.out
.println("顯示文本框...");}
}
class Window extends Component {@Overridepublic void display() {System
.out
.println("顯示窗體...");}
}
class ComponentDecorator extends Component{private Component component
;public ComponentDecorator(Component component
){this.component
=component
;}@Overridepublic void display() {component
.display();}
}
class BlackBorderDec extends ComponentDecorator {public BlackBorderDec(Component component
) {super(component
);}public void display(){this.setBlackBorder();super.display();}private void setBlackBorder() {System
.out
.println("添加了黑色邊框...");}
}
class ScrollBarDec extends ComponentDecorator {public ScrollBarDec(Component component
) {super(component
);}public void display(){this.setScrollBar();super.display();}private void setScrollBar() {System
.out
.println("添加了滾動條...");}
}
public class client {public static void main(String
[] args
) {Component component1
=new Window();Component comB
=new ScrollBarDec(component1
);Component comBB
=new BlackBorderDec(comB
);comWithBlack
.display();}
}
測試運行
發現
將裝飾一次之后的comB對象再次注入另一個具體裝飾類,實現第二次裝飾,得到了一個經過兩次裝飾的comBB對象,再調用display()方法就可以得到一個既有滾動條又有黑色邊框的窗體了。
四、擴展
透明裝飾模式和半透明裝飾模式
透明裝飾模式
在透明裝飾模式中要求客戶端完全針對抽象編程,裝飾模式的透明性要求客戶端程序不應該將對象聲明為具體構件類型或具體裝飾類型,而應該全部聲明為抽象構件類型。對客戶端而言,具體構件類和具體裝飾類對象沒有任何區別。(缺點,無法單獨調用裝飾類的獨有功能)
Window window
=new Window();Component window
=new Window();
半透明裝飾模式
用具體裝飾類型來定義裝飾后的對象,而具體構件類型仍然可以使用抽象構件類型來定義,可以單獨調用裝飾的獨有方法。(缺點:無法多次進行裝飾)
Component window
=new Window();BlackBorderDec blackBorder
=new BlackBorderDec(window
);blackBorder
.setBlackBorder();
五、總結:
特點:
(1)可以動態增加或刪除對象的職責,并使需要裝飾的具體構件類和具體裝飾類可以獨立變化,以便增加新的具體構件類和具體裝飾類。
(2)減少子類個數,擴展方便,容易維護。
(3)結構主要有抽象構件類,其子類有具體構件類和抽象裝飾類,而在抽象裝飾類中,其子類則是具體裝飾類。
適用環境:
(1)在不影響其他對象的情況下以動態透明的方式給單個對象添加職責。
(2)當不能采用繼承的方式時。主要有兩種情況:子類大爆炸,類已經被定義為不能繼承。
總結
以上是生活随笔為你收集整理的Java设计模式之装饰模式(透明装饰模式,半透明装饰模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。