ivaneeo's blog

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

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
          首先我要使用Replace Type Code with State/Strategy(227).第一步驟是針對[與型別相依的行為]使用Self Encapsulate Field(171),確保任何時候都通過gettingsetting兩個函數(shù)來運用這些行為。由于多數(shù)代碼來自其他classes,所以多數(shù)函數(shù)都已經(jīng)使用getting函數(shù)。但構(gòu)造函數(shù)(constructor)仍然直接訪問價格代碼:
          class Movie...
              public Movie(String name, int priceCode) {
                 _title = name;
                 _priceCode = priceCode;
              }

          我可以用一個setting函數(shù)來代替:
          class Movie...
              public Movie(String name, int priceCode) {
                 _title = name;
                 setPriceCode(priceCode);
              }
          現(xiàn)在我加入新class,并在price對象中提供[與型別相依的行為]。為了實現(xiàn)這一點,我在Price內(nèi)加入一個抽象函數(shù)(abstract method),并在其所有subclasses中加上對應(yīng)的具體函數(shù)(concrete method):

          abstract class Price {
              abstract int getPriceCode();   //取得價格代號
          }
          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)的[價格代號]訪問函數(shù)(get/set函數(shù),如下),讓它們使用新class。下面是重構(gòu)前的樣子:
          public int getPriceCode() {
              return _priceCode;
          }
          public void setPriceCode(int arg) {
              _priceCode;
          }
          private int _priceCode;

          這個意味我必須在Movie class內(nèi)保存一個price對象,而不再是保存一個_priceCode變量。此外我還需要修改訪問函數(shù):
          class Movie...
              public int getPriceCode() {   //取得價格代號
                 return _price.getPriceCode();
              }
              public void setPriceCode(int arg) {   //設(shè)定價格代碼
                 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) 評論(0)  編輯  收藏 所屬分類: refactoring-從地獄中重生
          主站蜘蛛池模板: 曲阳县| 濮阳市| 栾川县| 搜索| 盖州市| 佳木斯市| 沽源县| 上蔡县| 家居| 武冈市| 贵南县| 呼和浩特市| 汽车| 苏尼特右旗| 北辰区| 清苑县| 甘泉县| 延川县| 高台县| 霍林郭勒市| 辉南县| 临西县| 宾川县| 庆城县| 凤庆县| 宁乡县| 垦利县| 休宁县| 任丘市| 凤冈县| 安丘市| 邢台县| 德清县| 大新县| 靖江市| 鹿邑县| 白玉县| 共和县| 霍林郭勒市| 平顶山市| 沾益县|