iOS開發-模板方法模式

jopen 8年前發布 | 13K 次閱讀 模板方法 iOS開發 移動開發

模板方法模式定義一個操作中的算法的骨架,而將步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義算法的某些特定步驟。模板方法模式是由子類決定實現算法中的步驟,工廠方法由子類決定實現哪一個具體的類,策略模式是封裝可以互換的行為,使用委托決定采用哪一個行為,有的時候這三種容易出現理解上的偏差。

基礎知識

模板方法的UML類圖:

關于模板方法我們思考一個生活中的例子,我們都會網購,天貓或者京東,經歷一下四個步驟,①訪問網站②瀏覽下單③支付④收貨,兩種網站第二步和最后一步都是一樣的,訪問和支付的訪問不一樣,兩個網站網址不一樣,支付方式不一樣~稍微思考一下可以怎么實現~

實戰探討

關于上面的需要設計三個類,網購類,天貓類,京東類:

OnLineShop:

@protocol OnLineShopProtocol

@optional
-(void)accessURL;
@optional
-(void)pay;

@end

@interface OnLineShop : NSObject<OnLineShopProtocol>

-(void)shop;

-(Boolean)callMyMobileHook;

@end
@interface OnLineShop()

-(void)createOrder;

-(void)receiptGoods;

@end

@implementation OnLineShop

-(void)shop{
    [self accessURL];
    [self createOrder];
    [self pay];
    if ([self callMyMobileHook]) {
        [self receiptGoods];
    }
}

-(void)createOrder{
    NSLog(@"創建訂單成功");
}

-(void)receiptGoods{
    NSLog(@"收到了物品");
}
//子類可以回調鉤子
-(Boolean)callMyMobileHook{
    return true;
}

@end

Tmall類繼承自OnLineShop:

@implementation Tmall

-(void)accessURL{
    NSLog(@"https://www.taobao.com/");
}

-(void)pay{
    NSLog(@"支付寶");
}

-(Boolean)callMyMobileHook{
    return true;
}

@end

JDong類:

@implementation JDong

-(void)accessURL{
    NSLog(@"http://www.jd.com/");
}

-(void)pay{
    NSLog(@"貨到付款");
}

-(Boolean)callMyMobileHook{
    NSLog(@"博客園-FlyElephant");
    return false;
}

@end

代碼測試:

OnLineShop  *tmall=[[Tmall alloc]init];
    [tmall shop];
    OnLineShop *jd=[[JDong alloc]init];
    [jd shop];

測試結果:

模板方法優點: 

①模板方法模式通過把不變的行為搬移到超類,去除了子類中的重復代碼。

②子類實現算法的某些細節,有助于算法的擴展。通過一個父類調用子類實現的操作,

③通過子類擴展增加新的行為,符合“開放-封閉原則”。

缺點

①每個不同的實現都需要定義一個子類,這會導致類的個數的增加,設計更加抽象。

適用于在某些類的算法中,用了相同的方法,造成代碼的重復。 控制子類擴展,子類必須遵守算法規則。

模板方式中涉及到一個原則是好萊塢原則,別調用我們,我們會調用你~理解起來就是高層組件可以調用底層組件,底層組件不要調用高層組件~

來自: http://www.cnblogs.com/xiaofeixiang/p/5126158.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!