小話設計模式(二十二)模板方法模式

2021-07-23 10:22:22 字數 1793 閱讀 6791

模板方法適用於以下情況:

1、 一次性實現乙個演算法的固定部分,並將可變行為留給子類實現。

2、 各個子類中公共的行為應該被提取出來並集中到乙個公共的父類中用以避免**重複。

3、 控制子類擴充套件,父類提供了預設的方法,子類可以在必要時進行擴充套件。

模板方法模式一種特別常用的模式,你可能在程式設計過程中無意中就使用了它,而你卻沒有意識到這是一種設計模式。

舉個例子,遊戲裡的英雄具有三個屬性:力量、敏捷和智力。並且英雄型別也分為這三種,每種英雄的計算攻擊力的公式不同。

英雄定義:

public abstract class hero

public int agility

public int intelligence

public int attackplus

public hero(int str, int agi, int int)

public abstract int mainattributevalue ();

public virtual float attackpermainattribute ()

public abstract string mainattributename ();

public int calculateattack()

public string attributedescription()

attack per ", attackpermainattribute (), mainattributename ());

}}

我們將攻擊力的計算公式寫在了基類裡,然後由子類實現mainattributevalue方法返回主屬性值。

力量型英雄:

public class strengthhero : hero

public override int mainattributevalue()

public override string mainattributename ()

}

敏捷性英雄:

public class agilityhero : hero

public override int mainattributevalue()

public override string mainattributename ()

}

智力型英雄:

public class intelligencehero : hero

public override int mainattributevalue()

public override string mainattributename ()

}

使用:

hero hero = new strengthhero (10,20,8);

hero.attackplus = 29;

console.writeline (hero.calculateattack ());

console.writeline (hero.attributedescription ());

模板方法模式是一種非常實用且常用的模式,它提供了非常良好的**復用性。

當然這個模式也有乙個缺點,因為模板方法導致了一種反向的控制結構,即父類呼叫子類的方法,這使得**的可讀性變差。一些語言中(例如ruby、lua等),父類並不需要宣告乙個抽象方法或者虛方法便可以直接呼叫子類中的方法,這無疑是增加了**的閱讀難度。

設計模式(二十二)模板模式

在模板模式 template pattern 中,乙個抽象類公開定義了執行它的方法的方式 模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行。這種型別的設計模式屬於行為型模式。意圖 定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變乙個演算法的結構...

設計模式(二十二) 策略模式

有時候物件需要按照某種策略改變行為,我們可以利用策略模式,將策略或演算法提取出來,作為單獨的類實現。使用策略模式,可以讓具體演算法和應用物件分離,方便的根據不同條件替換策略。下面舉乙個例子。我們有乙個計算器,它會按照快和慢兩種策略來計算結果。所以我們可以將策略封裝起來。public inte ce ...

狀態模式 java設計模式(二十二)

共享狀態 優缺點和適用範圍 jdk中的應用 狀態模式 state pattern 允許乙個物件在內部狀態改變時改變行為,看起來似乎修改了類。狀態模式結構。狀態轉換可以由環境類統一負責。新增具體狀態需要修改環境類。public void changestate else if value 1 publ...