裝飾器模式(Decorator Pattern)該如何使用在項目?
點擊上方“JavaEdge”,關(guān)注公眾號
在實際開發(fā)中,一般你會如何給一個類或?qū)ο笮略鲂袨槟兀?/section>
繼承

子類在擁有自身方法的同時還擁有父類方法。但這種方案是比較靜態(tài)的,用戶無法控制新增行為的方式和時機。
關(guān)聯(lián)

將一個類的對象A嵌入另一個對象B,由另一個對象決定是否調(diào)用嵌入對象B的行為以便擴(kuò)展自身行為,這個嵌入的對象B就叫做裝飾器(Decorator)。
定義
角色
Component 接口

ConcreteComponent

Decorator

ConcreteDecorator

代碼案例
public interface Window {// 繪制窗口public void draw();// 返回窗口的描述public String getDescription();}
public class SimpleWindow implements Window {public void draw() {// 繪制窗口}public String getDescription() {return "simple window";}}
public abstract class WindowDecorator implements Window {// 被裝飾的Windowprotected Window decoratedWindow;public WindowDecorator (Window decoratedWindow) {this.decoratedWindow = decoratedWindow;}public void draw() {decoratedWindow.draw();}public String getDescription() {return decoratedWindow.getDescription();}}
public class VerticalScrollBar extends WindowDecorator {public VerticalScrollBar(Window windowToBeDecorated) {super(windowToBeDecorated);}public void draw() {super.draw();drawVerticalScrollBar();}private void drawVerticalScrollBar() {// Draw the vertical scrollbar}public String getDescription() {return super.getDescription() + ", including vertical scrollbars";}}
public class HorizontalScrollBar extends WindowDecorator {public HorizontalScrollBar (Window windowToBeDecorated) {super(windowToBeDecorated);}public void draw() {super.draw();drawHorizontalScrollBar();}private void drawHorizontalScrollBar() {// Draw the horizontal scrollbar}public String getDescription() {return super.getDescription() + ", including horizontal scrollbars";}}
優(yōu)點
缺點
適用場景
系統(tǒng)存在大量獨立擴(kuò)展,為支持每一種組合將產(chǎn)生大量的子類,使得子類數(shù)目呈爆炸性增長
類定義不能繼承(如final類)
擴(kuò)展
透明裝飾模式
要求客戶端完全針對抽象編程,裝飾模式的透明性要求客戶端程序不應(yīng)該聲明具體構(gòu)件類型和具體裝飾類型,而應(yīng)該全部聲明為抽象構(gòu)件類型。半透明裝飾模式
允許用戶在客戶端聲明具體裝飾者類型的對象,調(diào)用在具體裝飾者中新增的方法。
往期推薦
目前交流群已有 800+人,旨在促進(jìn)技術(shù)交流,可關(guān)注公眾號添加筆者微信邀請進(jìn)群
喜歡文章,點個“在看、點贊、分享”素質(zhì)三連支持一下~
評論
圖片
表情

