首先我要使用Replace Type Code with State/Strategy(227).第一步驟是針對(duì)[與型別相依的行為]使用Self Encapsulate Field(171),確保任何時(shí)候都通過(guò)getting和setting兩個(gè)函數(shù)來(lái)運(yùn)用這些行為。由于多數(shù)代碼來(lái)自其他classes,所以多數(shù)函數(shù)都已經(jīng)使用getting函數(shù)。但構(gòu)造函數(shù)(constructor)仍然直接訪問(wèn)價(jià)格代碼:
class Movie...
public Movie(String name, int priceCode) {
_title = name;
_priceCode = priceCode;
}
我可以用一個(gè)setting函數(shù)來(lái)代替:
class Movie...
public Movie(String name, int priceCode) {
_title = name;
setPriceCode(priceCode);
}
現(xiàn)在我加入新class,并在price對(duì)象中提供[與型別相依的行為]。為了實(shí)現(xiàn)這一點(diǎn),我在Price內(nèi)加入一個(gè)抽象函數(shù)(abstract method),并在其所有subclasses中加上對(duì)應(yīng)的具體函數(shù)(concrete method):
abstract class Price {
abstract int getPriceCode(); //取得價(jià)格代號(hào)
}
class ChildernsPrice extends Price {
int getPriceCode() {
return Movie.CHILDERNS;
}
}
class NewReleasePrice extends Price {
int getPriceCode() {
return Movie.NEW_RELEASE;
}
}
class RegularPrice extends Price {
int getPriceCode() {
return Movie.REGULAR;
}
}
現(xiàn)在,我需要修改Movie class內(nèi)的[價(jià)格代號(hào)]訪問(wèn)函數(shù)(get/set函數(shù),如下),讓它們使用新class。下面是重構(gòu)前的樣子:
public int getPriceCode() {
return _priceCode;
}
public void setPriceCode(int arg) {
_priceCode;
}
private int _priceCode;
這個(gè)意味我必須在Movie class內(nèi)保存一個(gè)price對(duì)象,而不再是保存一個(gè)_priceCode變量。此外我還需要修改訪問(wèn)函數(shù):
class Movie...
public int getPriceCode() { //取得價(jià)格代號(hào)
return _price.getPriceCode();
}
public void setPriceCode(int arg) { //設(shè)定價(jià)格代碼
switch(arg) {
case REGULAR: //普通片
_price = new RegularPrice();
break;
case CHILDERNS: //兒童片
_price = new ChildernsPrice();
break;
case NEW_RELEASE: //新片
_price = new NewReleasePrice();
break;
default:
throw new IllegalArument Exception("Incorrect Price Code");
}
}
private Price _price;
class Movie...
public Movie(String name, int priceCode) {
_title = name;
_priceCode = priceCode;
}
我可以用一個(gè)setting函數(shù)來(lái)代替:
class Movie...
public Movie(String name, int priceCode) {
_title = name;
setPriceCode(priceCode);
}
現(xiàn)在我加入新class,并在price對(duì)象中提供[與型別相依的行為]。為了實(shí)現(xiàn)這一點(diǎn),我在Price內(nèi)加入一個(gè)抽象函數(shù)(abstract method),并在其所有subclasses中加上對(duì)應(yīng)的具體函數(shù)(concrete method):
abstract class Price {
abstract int getPriceCode(); //取得價(jià)格代號(hào)
}
class ChildernsPrice extends Price {
int getPriceCode() {
return Movie.CHILDERNS;
}
}
class NewReleasePrice extends Price {
int getPriceCode() {
return Movie.NEW_RELEASE;
}
}
class RegularPrice extends Price {
int getPriceCode() {
return Movie.REGULAR;
}
}
現(xiàn)在,我需要修改Movie class內(nèi)的[價(jià)格代號(hào)]訪問(wèn)函數(shù)(get/set函數(shù),如下),讓它們使用新class。下面是重構(gòu)前的樣子:
public int getPriceCode() {
return _priceCode;
}
public void setPriceCode(int arg) {
_priceCode;
}
private int _priceCode;
這個(gè)意味我必須在Movie class內(nèi)保存一個(gè)price對(duì)象,而不再是保存一個(gè)_priceCode變量。此外我還需要修改訪問(wèn)函數(shù):
class Movie...
public int getPriceCode() { //取得價(jià)格代號(hào)
return _price.getPriceCode();
}
public void setPriceCode(int arg) { //設(shè)定價(jià)格代碼
switch(arg) {
case REGULAR: //普通片
_price = new RegularPrice();
break;
case CHILDERNS: //兒童片
_price = new ChildernsPrice();
break;
case NEW_RELEASE: //新片
_price = new NewReleasePrice();
break;
default:
throw new IllegalArument Exception("Incorrect Price Code");
}
}
private Price _price;