UML關(guān)系簡單介紹
UML簡單使用的介紹
創(chuàng)建型設(shè)計(jì)模式
Android設(shè)計(jì)模式-單例模式
Android設(shè)計(jì)模式-工廠模式
Android設(shè)計(jì)模式-抽象工廠模式
Android設(shè)計(jì)模式-建造者模式
Android設(shè)計(jì)模式-原型模式
結(jié)構(gòu)型設(shè)計(jì)模式
Android設(shè)計(jì)模式-代理模式
Android設(shè)計(jì)模式-裝飾模式
Android設(shè)計(jì)模式-適配器模式
Android設(shè)計(jì)模式-組合模式
Android設(shè)計(jì)模式-門面模式
Android設(shè)計(jì)模式-橋接模式
Android設(shè)計(jì)模式-享元模式
行為型設(shè)計(jì)模式
Android設(shè)計(jì)模式-策略模式
Android設(shè)計(jì)模式-命令模式
Android設(shè)計(jì)模式-責(zé)任鏈模式
Android設(shè)計(jì)模式-模版方法模式
Android設(shè)計(jì)模式-迭代器模式
Android設(shè)計(jì)模式-觀察者模式
Android設(shè)計(jì)模式-備忘錄模式
Android設(shè)計(jì)模式-中介者模式
Android設(shè)計(jì)模式-訪問者模式
Android設(shè)計(jì)模式-狀態(tài)模式
Android設(shè)計(jì)模式-解釋器模式
1.定義
定義一個(gè)操作中的算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
2.模版方法模式UML圖
角色介紹
- AbstractClass 抽象模版盾致,也就是抽象類胰默。夸政。 定義了一套具體步驟(也就是模版方法)蛔溃。擁有基本方法和模版方法肌毅,基本方法就是由子類實(shí)現(xiàn)的方法,并且在模版方法中調(diào)用筐喳。
- ConcreteClass 具體類 實(shí)現(xiàn)抽象類,并可具體修改某些步驟函喉,即基本方法避归。
為了防止子類的修改,一般都會給模版方法加上final修飾
抽象模版中的基本方法最好設(shè)置為protected類型管呵,不需要暴露的屬性和方法盡量不要設(shè)置為protected類型梳毙。實(shí)現(xiàn)類若非必要,盡量不要擴(kuò)大父類中的訪問權(quán)限捐下。
簡單實(shí)現(xiàn)
抽象模版
public abstract class AbstractClass {
protected abstract void m1();
protected abstract void m2();
protected abstract void m3();
public final void doMethod(){
m1();
m2();
m3();
}
}
具體實(shí)現(xiàn)類
public class ConcreteClass1 extends AbstractClass {
@Override
protected void m1() {
System.out.println("先進(jìn)行步驟a");
}
@Override
protected void m2() {
System.out.println("先進(jìn)行步驟b");
}
@Override
protected void m3() {
System.out.println("先進(jìn)行步驟c");
}
}
public class ConcreteClass2 extends AbstractClass {
@Override
protected void m1() {
System.out.println("先進(jìn)行步驟c");
}
@Override
protected void m2() {
System.out.println("先進(jìn)行步驟a");
}
@Override
protected void m3() {
System.out.println("先進(jìn)行步驟b");
}
}
客戶端調(diào)用
public class MyClass {
public static void main(String args[]) {
AbstractClass class1=new ConcreteClass1();
class1.doMethod();
System.out.println("----------");
AbstractClass class2=new ConcreteClass2();
class2.doMethod();
}
}
打印結(jié)果
先進(jìn)行步驟a
先進(jìn)行步驟b
先進(jìn)行步驟c
----------
先進(jìn)行步驟c
先進(jìn)行步驟a
先進(jìn)行步驟b
其實(shí)模版方法也就是簡單用到了類的繼承账锹,當(dāng)然實(shí)現(xiàn)上也不是必須修改具體的方法才能修改具體執(zhí)行順序,也可以在抽象類中的模版方法內(nèi)坷襟,添加返回值為boolean類型的方法進(jìn)行判斷奸柬,然后子類中重寫這種方法,也就能做到子類間接控制父類模版方法內(nèi)的執(zhí)行順序婴程。
4.總結(jié)
4.1優(yōu)點(diǎn)
- 封裝不變部分廓奕,擴(kuò)展可變部分,把認(rèn)為是不變的部分封裝進(jìn)父類中档叔,可變部分通過繼承在子類中進(jìn)行重寫桌粉。
- 便于維護(hù),因?yàn)榫唧w的代碼提取到了父類中衙四,而不是具體的子類铃肯,這樣也就不用到處找了。
- 行為由父類控制传蹈,具體由子類實(shí)現(xiàn)押逼,符合開閉原則
4.2缺點(diǎn)
- 往常中,抽象類中都是聲明一些最抽象最一般的屬性和方法卡睦,然后在子類中具體實(shí)現(xiàn)宴胧。而模版方法中,則進(jìn)行了顛倒表锻,只抽象了部分方法由子類實(shí)現(xiàn)恕齐,且子類實(shí)現(xiàn)可影響到父類的運(yùn)行邏輯,但是算是缺點(diǎn)嗎。显歧。仪或。好像也不算。士骤。畢竟封裝一些基類的時(shí)候也經(jīng)常用到范删。。
4.3使用場景
- 多個(gè)子類由公用的方法拷肌,并且邏輯基本相同
- 重要復(fù)雜的算法到旦,可以把核心算法設(shè)計(jì)模版方法,周邊的相關(guān)細(xì)節(jié)功能由子類具體實(shí)現(xiàn)巨缘。
- 重構(gòu)時(shí)添忘,模版方法是一個(gè)經(jīng)常會被用到的方法,把相同的代碼抽入到父類中若锁,然后通過子類實(shí)現(xiàn)約束其行為搁骑,就像上面類似返回值為boolean類型的方法,重寫改變其具體邏輯又固,這種方式也叫鉤子函數(shù)仲器。