為了增加軟體的彈性,現在流行使用一些著名的設計模式使程式與資料型態鬆綁,而策略模式主要用來使物件內的數能夠動態改變,聽起來很好,但是後來發現一個問題,C++如果要動態配置資料的話必須new一個指標,然後在初始化,可是這樣對於型態的相依性不就變得更高了嗎@@
#include < iostream>
#include "fly.h"//定義一個類別,只含有虛擬函數fly()
using std::cout;
using std::endl;
class Duck {
public:
Duck();
virtual void display(void) = 0;
void performfly(void);
protected:
I_Fly* fly_behavior;//一個飛行行為的物件
};
class Big_Duck : public Duck {
public:
Big_Duck();
void display(void);
};
int main() {
Big_Duck dunky;
dunky.display();
dunky.performfly();//讓鴨子飛
return 0;
}
Duck::Duck() {
}
void Duck::performfly(void) {
fly_behavior->fly();//這裡,用fly_behavior來決定到底該怎麼飛
}
void Big_Duck::display(void) {
cout<<"Im a big duck!!!"<<endl;
}
Big_Duck::Big_Duck() {//大鴨子是繼承鴨子的類別
Fly1 current_fly;//在初始化時決定使用Fly1這種飛行方式(除此之外,fly.h中還有很多其他的飛行方式)
Fly1 *fly = new Fly1;
*fly = current_fly;
fly_behavior = fly;//就是這裡!!!!!!!!!!!!!!!!!!!!!!!!!!一大堆的型態轉換
}
這是很奇怪的,我本來想從型態中鬆綁,實際做起來卻越來越嚴重,但其實這是C++語法才有的問題,在Java中用一個new就可以一行帶過,但這也說明即使是Java只要一接觸到實做(new)就一定會跟型態榜定,因為到這個階段就已經不是抽象方法的範圍了,所以C++花了4行的寫法的問題,其實只有資料型態Fly1一直不必要的重複出現而已,既然我都要實體化物件了,型態當然會統一用同一個啊,可是C++很嚴格,一直逼我指定型態,明明都一樣啊,所以我後來使用樣板函數把
Fly1 current_fly;
Fly1 *fly = new Fly1;
*fly = current_fly;
fly_behavior = fly;
改成類似於Java的
fly_behavior = new Fly1;囉~~~=W=
這樣策略模式的實做就很方便了,就算在增加其他的behavior或其他的fly方法,<span style="color:#FF0000"><span style="font-size:x-large;">都不用在更改已經寫好得程式碼囉</span></span>
這是使用設計模式真正的好處,雖然把類別硬是作成這個樣子挺累人的,但是她卻經得起改變,不會因為增加功能就到處修改、DeBug、陷入除錯的地獄中,事實上,打開fly.h,你就知道增加新方法是多麼簡單了=W=
#ifndef __FLY_H__
#define __FLY_H__
#include <iostream>
using std::cout;
using std::endl;
class I_Fly {
public:
I_Fly();
virtual void fly(void);
};
I_Fly::I_Fly() {
}
void I_Fly::fly(void) {
}
class Fly1 : public I_Fly {
public:
Fly1();
void fly(void);
};
Fly1::Fly1() {
}
void Fly1::fly(void) {
cout<<"Fly~~~"<<endl;
}
class Fly2 : public I_Fly {
public:
Fly2();
void fly(void);
};
Fly2::Fly2() {
}
void Fly2::fly(void) {
cout<<"Flyyyyyyy"<<endl;
}
#endif
是不是都長一個樣啊~~~~~~~
No comments :
Post a Comment