設計模式專欄
裝飾器模式(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...