<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 176, comments - 240, trackbacks - 0, articles - 7

    通過繼承構造業務對象環境

    Posted on 2005-12-06 22:33 canonical 閱讀(506) 評論(0)  編輯  收藏 所屬分類: 軟件開發
        現在很多設計中推崇接口和依賴注入(dependency injection),而不傾向于采用繼承機制來構造程序結構。但很多時候作為一種簡便而廉價的封裝方法,繼承仍然是不可或缺的. 例如與一些Engine打交道的時候,需要實現某些特定的接口. 在osworkflow中, 我們需要實現FunctionProvider接口,
         interface FunctionProvider{
            void execute(Map transientVars, Map args, PropertySet ps) throws WorkflowException;
         }
        在Quartz中需要實現Job接口
          interface Job{
              public void execute(JobExecutionContext context) throws JobExecutionException;
          }
        這些接口是一種技術性的要求, 它們表示了代碼生存所依賴的技術環境. 為了屏蔽這種對于外部引擎的依賴, 我們可以簡單的選擇實現一個基類,
        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等函數就可以回避對于osworkflow特有的PropertySet類的依賴,而只在概念上需要一 個對象的持久化機制.當我們把業務代碼從osworkflow移植到其他工作流引擎的時候, 只需要改變一下基類即可.我們可以在基類中引入更加特殊的假 設,
        abstract AbstractBusinessFunction extends AbstractFunction{
            public BusinessObject getBusinessObject(){
                return transientVars.get("businessObject");
            }

            public void commonBusinessOp(){ ... }
        }

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

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

    主站蜘蛛池模板: 亚洲一区二区三区乱码A| 国产老女人精品免费视频| 亚洲av色影在线| 国内精品免费在线观看| 久久久久亚洲AV成人网人人网站| 免费的黄网站男人的天堂| 国产一级一片免费播放i| 猫咪免费人成网站在线观看入口| 亚洲成年看片在线观看| 农村寡妇一级毛片免费看视频 | a级毛片在线免费看| 亚洲av不卡一区二区三区| 99re免费在线视频| 中文字幕亚洲综合小综合在线| 毛片免费观看网站| 香港一级毛片免费看| 亚洲女同成av人片在线观看 | 亚洲AV无码片一区二区三区| 免费在线一级毛片| 亚洲免费人成在线视频观看 | 你懂的免费在线观看| 亚洲第一福利网站| 成年大片免费视频| 久久WWW免费人成—看片| 精品亚洲成a人片在线观看少妇| 在线v片免费观看视频| 老司机福利在线免费观看| 久久精品国产亚洲网站| 日本免费网址大全在线观看| 看亚洲a级一级毛片| 亚洲AV无码日韩AV无码导航| 毛片免费观看网址| 青青操免费在线视频| 在线综合亚洲中文精品| 自拍偷自拍亚洲精品第1页 | 亚洲第一页在线播放| 国产免费直播在线观看视频| 免费日本一区二区| 国产偷国产偷亚洲高清在线| 亚洲精品在线免费看| 亚洲免费视频一区二区三区|