天天看點

行為型模式之模闆模式場景模式結構和說明示例代碼模式講解

行為型模式之模闆模式

  • 場景
  • 模式結構和說明
  • 示例代碼
  • 模式講解
    • 1. 模式的功能
    • 2. 變與不變
在模闆模式(Template Pattern)中,一個抽象類公開定義了執行它的方法的方式/模闆.它的子類可以按需要重寫方法實作,但調用将以抽象類中定義的方式進行.這種類型的設計模式屬于行為型模式

使用模闆方法要思考一下幾點:

  • 在父類中一次性實作算法中不可變部分,并将可變的行為留給子類來實作
  • 子類公用的行為應該被提出來放到公共類中,以避免代碼重發
  • 要考慮一些特殊情況特殊處理.這裡采用子類的擴充來實作。可以定義一些在特定點調用“鈎子”操作方法。子類可以通過對鈎子操作的實作進而在這些點上擴充功能。鈎子操作預設情況是不對整個模闆造成影響的。子類重載後,才為模闆算法提供附加的操作。比如項目中的某些資料請求方法要加請求頭token之類,但其它大部分網絡請求卻不需要,就可以采用"鈎子"操作來實作。

場景

比如,小時候老師布置作業都是說多少頁第幾題,抄寫題目并答題,這樣我們就需要先抄題目再做答案,有時候沒看清或沒聽清把題目抄錯了,這就意味着,即使我們做的再好,也不會正确

後來老師每次布置作業都是發試卷,這樣的好處就是大家的題目是一樣的,大家做答案就行了,這就是模闆模式,題目一樣,不同的是答案不一樣

模式結構和說明

行為型模式之模闆模式場景模式結構和說明示例代碼模式講解

AbstractClass:抽象類.用來定義算法骨架和原語操作,具體的子類通過重定義這些原語操作來實作一個算法的各個步驟.在這個類裡面,還可以提供算法中通用的實作

ConcreteClass:具體實作類.用來實作算法骨架中的某些步驟,完成跟特定子類相關的功能

示例代碼

  1. 定義抽象類(模闆)
@interface GTPaper : NSObject
/**/
@property (nonatomic,strong) NSString *answer;
//題目1
- (void)subject1;
//題目2
- (void)subject2;

@end
- (void)subject1
{
    NSLog(@"中國是世界%@ 人口大國\n A 第一 B 第二 C 第三 D 第四 ",self.answer);
}
- (void)subject2
{
    NSLog(@"刀削面是%@省的特色\n A 山東 B 山西  C 陝西  D 蘭州",self.answer);
}
           
  1. 定義子類,完成特有功能
@implementation GTPagerA
- (void)subject1
{
    self.answer = @"A 第一";
    [super subject1];
}

- (void)subject2
{
    self.answer = @"A 山東";
    [super subject2];
}
@end
           
@implementation GTPagerB

- (void)subject1
{
    self.answer = @"A 第一";
    [super subject1];
}

- (void)subject2
{
    self.answer = @"B 山西";
    [super subject2];
}

@end
           

可以看出上面的子類隻有答案是不同的

3. 用戶端實踐

GTPaper *pageA = [GTPagerA new];
    [pageA subject1];
    [pageA subject2];
    
    GTPaper *pageB = [GTPagerB new];
    [pageB subject1];
    [pageB subject2];
           
行為型模式之模闆模式場景模式結構和說明示例代碼模式講解

模式講解

1. 模式的功能

模闆方法的功能在于固定算法骨架,而讓具體算法實作可擴充。

模闆方法還額外提供了一個好處,就是可以控制子類的擴充.因為在父類裡面定義好了算法的步驟,隻是在某幾個固定的點才會調用到被子類實作的方法,是以也就隻允許在這幾個點來擴充功能,這些個可以被子類覆寫以擴充功能的方法通常被稱為"鈎子"方法

2. 變與不變

程式設計的一個很重要的思考點就是“變與不變”,也就是分析程式中哪些功能是可變的,哪些功能是不變的,然後把不變的部分抽象出來,進行公共的實作,把變化的部分分離出去,用接口來封裝隔離,或者是用抽象類來限制子類行為。

模闆方法模式很好的展現了這一點。模闆類實作的就是不變的方法和算法的骨架,而需要變化的地方,都通過抽象方法,把具體實作延遲到子類去了,而且還通過父類的定義來限制了子類的行為,進而使系統能有更好的複用性和擴充性。

講到這大家再想想除了繼承外,還有别的方式可以實作模式的思想嗎?

答案肯定的有,那就是回調機制,先實作公共部分,然後在回調裡實作不同的處理方式,從某一個方面而言,回調機制要比繼承好,因為oc的繼承是單繼承的,對子類而言,使用繼承方式,就不能繼承其他對象了,并且回調機制是通過委托方式來實作功能的,耦合成都要比繼承低,大家可以試試,這裡不做過多代碼實作

Demo位址

繼續閱讀