posts - 176, comments - 240, trackbacks - 0, articles - 7
              現(xiàn)在很多設(shè)計中推崇接口和依賴注入(dependency injection),而不傾向于采用繼承機制來構(gòu)造程序結(jié)構(gòu)。但很多時候作為一種簡便而廉價的封裝方法,繼承仍然是不可或缺的. 例如與一些Engine打交道的時候,需要實現(xiàn)某些特定的接口. 在osworkflow中, 我們需要實現(xiàn)FunctionProvider接口,
               interface FunctionProvider{
                  void execute(Map transientVars, Map args, PropertySet ps) throws WorkflowException;
               }
              在Quartz中需要實現(xiàn)Job接口
                interface Job{
                    public void execute(JobExecutionContext context) throws JobExecutionException;
                }
              這些接口是一種技術(shù)性的要求, 它們表示了代碼生存所依賴的技術(shù)環(huán)境. 為了屏蔽這種對于外部引擎的依賴, 我們可以簡單的選擇實現(xiàn)一個基類,
              abstract class AbstractFunction implements FunctionProvider,Runnable{
                  Map transientVars;
                  Map args;
                  PropertySet ps;

                  public final void execute(Map transientVars, Map args, PropertySet ps){
                      this.transientVars = transientVars;
                      this.args = args;
                      this.ps = ps;
                      run();
                  }

                  public Object getPersistVar(String name){
                     return ps.getAsActualType(name);
                  }

                  public void setPersistVar(String name, Object value){
                     ps.setAsActualType(name,value);
                  }

                  public void removePersistVar(String name){
                     ps.remove(name);
                  }
              }
              在派生類中我們只要使用getPersistVar等函數(shù)就可以回避對于osworkflow特有的PropertySet類的依賴,而只在概念上需要一 個對象的持久化機制.當我們把業(yè)務(wù)代碼從osworkflow移植到其他工作流引擎的時候, 只需要改變一下基類即可.我們可以在基類中引入更加特殊的假 設(shè),
              abstract AbstractBusinessFunction extends AbstractFunction{
                  public BusinessObject getBusinessObject(){
                      return transientVars.get("businessObject");
                  }

                  public void commonBusinessOp(){ ... }
              }

              AbstractBusinessFunction提供的可以是一個完整的業(yè)務(wù)對象環(huán)境, 我們在派生類中的所有代碼都可以是與業(yè)務(wù)直接相關(guān)的,而與具體 的技術(shù)實現(xiàn)無關(guān)(例如業(yè)務(wù)變量是存放在transientVars中還是存放在args中)

              class BusinessFunction extends AbstractBusinessFunction{
                  public void run(){
                      BusinessObject bo = getBusinessObject();
                      bo.methodA();
                      commonBusinessOp();
                  }
              }
              對于我們來說實際有意義的是在派生類中所書寫的代碼,基類僅僅提供一個環(huán)境而已.無論我們使用Ioc注入業(yè)務(wù)變量還是從transientVars中主動 獲取業(yè)務(wù)變量,都是與我們的業(yè)務(wù)操作無關(guān)的. 實際上在理論上我們希望整個基類都可以是注入的(包括業(yè)務(wù)變量和業(yè)務(wù)操作),在泛型編程中這對應(yīng)于所謂的 policy class.

          主站蜘蛛池模板: 陆良县| 鸡东县| 乐业县| 谷城县| 嘉祥县| 兴隆县| 长兴县| 漳浦县| 阜阳市| 吴江市| 讷河市| 苏州市| 北辰区| 尼勒克县| 谢通门县| 英山县| 双辽市| 澄江县| 平陆县| 梁山县| 巴楚县| 红桥区| 旌德县| 镇远县| 湖州市| 淮北市| 云阳县| 乌拉特后旗| 咸丰县| 嵊泗县| 开封市| 南木林县| 专栏| 抚远县| 连云港市| 军事| 富平县| 伊川县| 九江市| 河北区| 那曲县|