想更深入探索一款軟件的的生命周期, 從設計到它的使命完結被替換或者升級換代
- 做開發(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