最近在看關(guān)于設(shè)計(jì)模式的書籍锨亏,開始覺得在設(shè)計(jì)程序架構(gòu)之時(shí),能夠靈活運(yùn)用這些設(shè)計(jì)模式纵诞,代碼將變得非常具有美感上祈。一個(gè)好的設(shè)計(jì)模式使得程序更加的靈活,容易修改浙芙,易于使用登刺。
從最簡單的簡單工廠模式開始學(xué)起,舉一個(gè)實(shí)現(xiàn)計(jì)算器的例子嗡呼,來完成簡單工廠模式纸俭。
一個(gè)簡單計(jì)算器,用四則運(yùn)算來考慮的話南窗,加減乘除揍很,那么初學(xué)者會(huì)覺得很簡單,用if條件來進(jìn)行判斷万伤,判斷好了之后就可以完成要求窒悔,而稍微有經(jīng)驗(yàn)點(diǎn)的 可能會(huì)選擇switch case的判斷方式,例如下面的代碼:
Operation運(yùn)算方法的邏輯
- (void)operationWithnumberA:(double )numberA Withoperator:(char)operator WithnumberB:(double )numberB
{
/**
* 封裝了一個(gè)傳遞值的方法
*
* @param numberA 數(shù)字A
* @param operator 運(yùn)算符
* @param numberB 數(shù)字B
*/
double result = 0;
switch (operator) {
case 'a':
result = numberA + numberB;
break;
case 'b':
result = numberA - numberB;
break;
case 'c':
result = numberA * numberB;
break;
case 'd':
if (numberB == 0) {
NSLog(@"除數(shù)不能為0 請(qǐng)重新輸入");
}else{
result = numberA / numberB;
}
case 'e':
NSLog(@"退出");
break;
default:
break;
}
而客戶端方面的代碼 我們可以這么寫
/**
* 四則運(yùn)算
*/
- (void)operation
{
char a ;
double numberA;
NSLog(@"請(qǐng)輸入數(shù)字A");
scanf("%lf",&numberA);
double numberB;
NSLog(@"請(qǐng)輸入數(shù)字B");
scanf("%lf",&numberB);
NSLog(@"加法請(qǐng)輸入a");
NSLog(@"減法請(qǐng)輸入b");
NSLog(@"乘法請(qǐng)輸入c");
NSLog(@"除法請(qǐng)輸入d");
NSLog(@"退出請(qǐng)輸入e");
scanf("%c",&a);
[self operationWithnumberA:numberA Withoperator:a WithnumberB:numberB];
}
在我們得到需要的數(shù)值之后壕翩,調(diào)用運(yùn)算方法做判斷蛉迹,算出結(jié)果傅寡。
這樣寫就會(huì)比if的判斷清晰放妈,因?yàn)槲覀円呀?jīng)把業(yè)務(wù)邏輯和界面顯示的部分完全分離了北救,在任何需要用到的地方,我們就可以直接復(fù)制這段代碼芜抒,完成運(yùn)算珍策。
但是假如,我有一天的運(yùn)算需求不滿足于四則運(yùn)算宅倒,而是希望加上開根號(hào)或者平方的運(yùn)算方法攘宙,該怎么辦。難道我們還要回頭拐迁,去switch語句里再加判斷條件蹭劈,之后在界面上增加提示么?
之前的代碼线召,我們只用到了面向?qū)ο蟮娜齻€(gè)特性之一铺韧,就是封裝,而解決我上一段話提出的疑問缓淹,我們可以用到另外兩個(gè)特性哈打,多態(tài)和繼承來實(shí)現(xiàn)。
為了實(shí)現(xiàn)之前的要求讯壶,在不改動(dòng)其他代碼的情況下料仗,能夠增加更多的運(yùn)算方法,或者修改出問題的運(yùn)算方法伏蚊。那么我們首先先把四則運(yùn)算立轧,封裝成四個(gè)類,即為加法類丙挽、減法類肺孵、乘法類、除法類颜阐。
@implementation AddOperation
/**
* 加法
*/
+ (double)addOperationWithNumberA:(double)numberA WithNumberB:(double)numberB
{
double result = 0;
result = numberA + numberB ;
NSLog(@"%f",result);
return result;
}
@implementation SubOperation
/**
* 減法
*/
+ (double)subOperationWithNumberA:(double)numberA WithNumberB:(double)numberB
{
double result = 0;
result = numberA - numberB ;
NSLog(@"%f",result);
return result;
}
@implementation MulOperation
/**
* 乘法
*/
+ (double)mulOperationWithNumberA:(double)numberA WithNumberB:(double)numberB
{
double result = 0;
result = numberA * numberB ;
NSLog(@"%f",result);
return result;
}
@implementation DivOperation
/**
* 除法
*/
+ (double)divOperationWithNumberA:(double)numberA WithNumberB:(double)numberB
{
double result = 0;
if (numberB == 0) {
NSLog(@"除數(shù)不能為0 請(qǐng)重新輸入");
}else{
result = numberA / numberB;
}
NSLog(@"%f",result);
return result;
}
這樣我們就已經(jīng)把四則運(yùn)算平窘,封裝成了四個(gè)類。因?yàn)橥祽械试梗也]有設(shè)計(jì)界面模型瑰艘,只是把結(jié)果輸出來,所以每段輸出結(jié)果的NSLog請(qǐng)不要介意肤舞。
接下來紫新,我們?cè)诤唵喂S的Operation類中,把調(diào)用這四個(gè)類的運(yùn)算方法實(shí)現(xiàn)李剖。
/**
* 封裝了一個(gè)運(yùn)算方法
*
* @param numberA 數(shù)字A
* @param operator 運(yùn)算符
* @param numberB 數(shù)字B
*/
+ (void)operationWithnumberA:(double )numberA Withoperator:(char)operator WithnumberB:(double )numberB
{
switch (operator) {
case 'a':
[AddOperation addOperationWithNumberA:numberA WithNumberB:numberB];
break;
case 'b':
[SubOperation subOperationWithNumberA:numberA WithNumberB:numberB];
break;
case 'c':
[MulOperation mulOperationWithNumberA:numberA WithNumberB:numberB];
break;
case 'd':
[DivOperation divOperationWithNumberA:numberA WithNumberB:numberB];
break;
case 'e':
NSLog(@"退出");
break;
default:
break;
}
}
以上就是在簡單工廠的類中芒率,調(diào)用四個(gè)運(yùn)算方法的類,來實(shí)現(xiàn)運(yùn)算篙顺,并且成功解耦合偶芍,有利于以后的維護(hù)和擴(kuò)展充择。客戶端方面的代碼也就非常簡單匪蟀。
/**
* 四則運(yùn)算
*/
- (void)operation
{
char a = 'a';
double numberA = 10;
double numberB = 20;
// NSLog(@"加法請(qǐng)輸入a");
// NSLog(@"減法請(qǐng)輸入b");
// NSLog(@"乘法請(qǐng)輸入c");
// NSLog(@"除法請(qǐng)輸入d");
// NSLog(@"退出請(qǐng)輸入e");
[Operation operationWithnumberA:numberA Withoperator:a WithnumberB:numberB];
}
客戶端的代碼還是偷懶椎麦,沒有設(shè)計(jì)UI部分,所以也直接把數(shù)據(jù)代入進(jìn)去了材彪,但是大體的思路就是這樣观挎。直接用面向?qū)ο蟮娜筇匦詠斫鉀Q問題,在設(shè)計(jì)代碼時(shí)段化,一定要本著可維護(hù)嘁捷、可復(fù)用、可擴(kuò)展显熏、靈活性好的設(shè)計(jì)思路來設(shè)計(jì)普气。尤其要注意,這里的可復(fù)用佃延,可不是可復(fù)制哦现诀。今天的學(xué)習(xí)筆記就寫到這里。
簡單工廠模式的Demo我已經(jīng)上傳到Github上履肃,如果覺得對(duì)您有幫助仔沿,請(qǐng)star我。