設計模式(五)裝飾器模式

2021-09-11 20:11:08 字數 2323 閱讀 5022

設計模式專欄

裝飾器模式(decorator pattern)允許向乙個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。

這種模式建立了乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。

我們通過下面的例項來演示裝飾器模式的用法。其中,我們將一部手機安裝不同的應用軟體,從而實現不同的功能,因為我不是廠商,所以出廠的時候不能進行定製,所以,這裡以演示給手機裝軟體,實現不同的功能。

public abstract class mobilephone
public class newphone extends mobilephone

}

public abstract class decorator extends mobilephone 

@override

void call()

}

public class installapkdecorator extends decorator 

@override

void call()

private void installapk(string s)

}

public class client 

}

再來看看再android中的巧妙的使用,如果你是乙個android開發者,原生的recycleview的adapter 是不支援直接新增頭view,為了在專案中更好的使用,可以使用裝飾器模式,將原生的adapter保持不動,增加addheader(view) 方法,實現類似於listview新增頭部的功能,這裡展示乙個鴻洋大神封裝的adapter裝飾器,文末有詳細原文。

private static final int base_item_type_header = 100000;

private static final int base_item_type_footer = 200000;

private sparsearraycompatmheaderviews = new sparsearraycompat<>();

private sparsearraycompatmfootviews = new sparsearraycompat<>();

private recyclerview.adapter minneradapter;

private boolean isheaderviewpos(int position)

private boolean isfooterviewpos(int position)

public void addheaderview(view view)

public void addfootview(view view)

public int getheaderscount()

public int getfooterscount()

} 複寫核心方法

@override

public recyclerview.viewholder oncreateviewholder(viewgroup parent, int viewtype)

else if (mfootviews.get(viewtype) != null)

return minneradapter.oncreateviewholder(parent, viewtype);

}@override

public int getitemviewtype(int position)

else if (isfooterviewpos(position))

return minneradapter.getitemviewtype(position - getheaderscount());

}private int getrealitemcount()

@override

public void onbindviewholder(recyclerview.viewholder holder, int position)

if (isfooterviewpos(position))

minneradapter.onbindviewholder(holder, position - getheaderscount());

}@override

public int getitemcount()

}

設計模式(五) 裝飾模式

什麼是裝飾模式?裝飾模式 decorator 動態的給乙個物件增加一些額外的職責,就增加功能來說,裝飾模式比生成子類更加靈活。一般而言,當系統需要實現新功能時候,我們會向舊的類中新增新的 以擴充套件其功能。我們將這種行為稱為對主類的裝飾,但這種做法的問題在於,在主類中增加了屬性和方法,從而增加了主類...

設計模式(五)裝飾模式

一 概念 特點 裝飾者和被裝飾者擁有相同的超型別 可能是抽象類也可能是介面 在裝飾類中包含乙個被裝飾元件類的物件引用 可以為被裝飾物件新增額外的功能 在裝飾類中重寫被裝飾元件類中的方法,並對被裝飾元件類中對應的方法呼叫 因為裝飾者和被裝飾者擁有相同的抽象型別,因此在任何需要原始物件 被包裝 的場合,...

(五)設計模式 裝飾模式

動態的給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。人 concretecomponet定義了乙個具體的物件,也可以給這個物件新增職責。服飾 裝飾抽象類,繼承componet,從外類來擴充套件componet類的功能,但對於componet來說,是無需知道decorato...