Head_First設計模式(一)----策略模式

想更深入探索一款軟件的的生命周期, 從設計到它的使命完結被替換或者升級換代

  • 做開發(fā)也有一段時間了, 想想自己還在為這個類那個對象蛋疼的時候, 別人已經(jīng)開始做架構, 設計模式, 想著如何讓工程更健壯具有彈性, 用以應付不斷的需求變化。
  • 我也/(ㄒoㄒ)/~~哭著在后面追趕了, 只希望不要被拉下太遠。
  • 接下來會陸續(xù)的對研究內(nèi)容做一些整理和總結并記錄下來。

簡述設計模式(下一篇這里將只介紹本篇所學習的模式)

簡述設計模式: 設計模式是讓你和其他開發(fā)人員之間有共同的詞匯(*********共享詞匯*********), 一旦懂得這些詞匯, 和其他開發(fā)人員之間的溝通就很容易, 也會促使那些不懂得程序員想開始學習設計模式。 設計模式也可以把你思考架構的層次提高到模式層面, 而不是及停留在瑣碎的類和對象上。

共享詞匯: 模式可以讓你用更少的詞匯做更充分的溝通, 幫助初級開發(fā)者快速成長, 它是我們程序員的"行話"

簡述策略模式: 定義算法族, 分別封裝起來, 讓他們之間可以互相替換, 此模式讓算法的變化獨立于使用算法的客戶

  • PS: 書中是以JAVA為語言基礎給出的例子, 這里作者主要做的是iOS開發(fā), 所以翻譯成OC進行舉例

相關知識點和思路

涉及到的知識點

主要包括: ****封裝****, ****繼承****, ****多肽的使用****(****對應部分會在代碼中詳細標注****)。

思路分析

工程中經(jīng)常遇到一些模塊對象, 具有一些固定的習慣, 當然也有一些變化的習慣, 對于這些經(jīng)常會發(fā)生變化的習慣, 我們采取策略模式將行為封裝成類從父類中剝離出來, 這樣不緊方便維護和管理, 也容易擴展, 使得這個類更具有彈性, 書中是以鴨子類來舉例,

代碼實現(xiàn)

準備工作

(1).鴨子父類
聲明部分
/* Duck 類(所有鴨子的父類) */
#import <Foundation/Foundation.h>

@class FlyBehaviro;

@interface Duck : NSObject

#pragma mark - 
#pragma mark 所有鴨子都有的習慣行為, 一般不會發(fā)生變化

- (void)swim; /* 游泳 */

- (void)display;  /* 外觀, 紅頭綠毛 */

#pragma mark -
#pragma mark 會發(fā)生變化的方法, 定義一個行為屬性通過屬性調(diào)用。
/**
 *  用于實現(xiàn)替換和行為實現(xiàn)所封裝的獨立類
 */
@property (nonatomic, strong) FlyBehaviro *flyBehaviro;

@end

實現(xiàn)部分
#import "Duck.h"
#import "FlyBehaviro.h" /* 封裝好的用于判斷鴨子飛行行為的類 */

@interface Duck ()

@end

@implementation Duck

- (instancetype)init
{
    self = [super init];
    if (self) {
        
        _flyBehaviro = [[FlyBehaviro alloc] init];/* 初始化方便繼承鴨子類的子類直接調(diào)用 */
        
  //_flyBehaviro = [FlyBehaviro sharedFlyBehaviro];
    }
    return self;
}

@end

(2).習慣類封裝和實現(xiàn)
聲明部分

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSUInteger, FlyStyle) {
    Wings,
    NoFly,
    Rocket,
};

@interface FlyBehaviro : NSObject

+ (FlyBehaviro *)sharedFlyBehaviro;
/**
 *  飛行方式
 *
 *  @param flyStyle 飛行方式類型
 */

- (void)duckFlyWith:(FlyStyle)flyStyle;

@end

實現(xiàn)部分
/* 封裝 */
#import "FlyBehaviro.h"

@implementation FlyBehaviro

static FlyBehaviro *sharedFlyBehaviro = nil;

+ (FlyBehaviro *)sharedFlyBehaviro
{
    
    static dispatch_once_t predicate;
    
    dispatch_once(&predicate, ^{
        
        sharedFlyBehaviro = [[self alloc] init];
        
    });
    
    return sharedFlyBehaviro;
}

- (void)duckWith:(FlyStyle)flyStyle {
    switch (flyStyle) {
        case 0:
            [self noFly];
            break;
            
        case 1:
            [self fly];
            break;
            
        case 2:
            [self rockedFly];
            break;
    }

}

- (void)rockedFly {
    NSLog(@"rocketFly");
}

- (void)fly {
    NSLog(@"feifeifei");
}
- (void)noFly {
    NSLog(@"noFly");
}

(3)繼承了鴨子類的紅頭鴨子類
/* 繼承 */
/* 聲明 */
#import "Duck.h"

@interface mDuck : Duck

@end
/* 實現(xiàn) */
#import "mDuck.h"

@implementation mDuck

@end

使用

/* 多肽 */
 Duck *r = [[mDuck alloc] init]; /* 直接使用繼承多肽性創(chuàng)建紅頭鴨對象, 父類指針指向子類 */
    [r.flyBehaviro duckWith:Rocket];/* 在父類種已經(jīng)初始化過了可以直接使用 */
  • PS: 父類種的flyBehaviro屬性可一個寫成一個單利進行初始化, 避免多次使用浪費空間

優(yōu)缺點分析

優(yōu)點

策略模式提供了管理相關算法族的辦法,恰當?shù)氖褂美^承可以把公共的代碼移到父類里面,從而避免重復的代碼。

策略模式提供了可以替換繼承關系的辦法。

使用策略模式可以避免使用多重條件轉(zhuǎn)移語句。

缺點

客戶端必須了解所有的strategy,必須了解各個strategy之間的不同點,這樣才能選擇一個合適的strategy

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容