ivaneeo's blog

          自由的力量,自由的生活。

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
          首先我要使用Replace Type Code with State/Strategy(227).第一步驟是針對(duì)[與型別相依的行為]使用Self Encapsulate Field(171),確保任何時(shí)候都通過(guò)gettingsetting兩個(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;
          posted on 2005-08-15 17:18 ivaneeo 閱讀(177) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): refactoring-從地獄中重生
          主站蜘蛛池模板: 常山县| 西昌市| 饶平县| 呈贡县| 阳谷县| 石楼县| 延吉市| 元谋县| 遵化市| 南阳市| 连平县| 白河县| 山西省| 内江市| 荥经县| 增城市| 焦作市| 江山市| 清流县| 平度市| 徐水县| 天津市| 综艺| 澎湖县| 靖边县| 枞阳县| 奇台县| 永胜县| 晋城| 阳泉市| 静安区| 梓潼县| 渭南市| 滁州市| 明溪县| 通州市| 资源县| 黑水县| 博罗县| 安化县| 永胜县|