`
canonical
  • 浏览: 358584 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通过继承构造业务对象环境

阅读更多
    现在很多设计中推崇接口和依赖注入(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.

分享到:
评论

相关推荐

    QT窗口与业务逻辑分离

    首先使用面向对象的思想,继承QWidget,如果多组件,可以使用多继承; def __init__(self, parent=None): super().__init__(parent) 其次定义号初始化gui的内容,将gui方法放入构造器里面初始化; 最后在_main_中...

    基于Java继承关系改进学生选课模拟系统【100011985】

    5、course 被继承父类: (1)设定编号、课程名称、上课地点、时间、教授老师属性 (2)编写构造方法,使实例化对象时即可完成属性赋值 (3)重写方法 toString(),用于输出课程详细信息 (4)将其移至新建 package ...

    面向对象分析与设计课程设计 宠物救助申请管理系统项目设计报告 原创 48页课程大作业

    面向对象就是以对象为中心,以类和继承为构造机制,以接口和多态提供灵活性的一套方法论 面向对象分析与设计 系统概述 问题描述 涉众概要及系统目标 项目定位 业务流程 项目特色 用例模型与非功能性需求 用例模型 ...

    Java基础篇——三大特性(继承)

    Java是一门面向对象的语言:“对象这种观念本身就是 十分方便的工具,使得你可以通过概念将数据和功能封装到一起,因此可以对问题空间的观念给出恰当的表示,而不用受制于必须使用底层及其语言。这些概念用关键字...

    超级有影响力霸气的Java面试题大全文档

    面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性:  多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化...

    Spring面试题

    9.spring的DI机制降低了业务对象替换的复杂性 10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部 什么是DI机制? 依赖注入(Dependecy Injection)和控制反转...

    摩托罗拉C++面试题

    构造函数不能为虚函数,要构造一个对象,必须清楚地知道要构造什么,否则无法构造一个对象。 析构函数可以为纯虚函数。 10,拷贝构造函数相关问题,深拷贝,浅拷贝,临时对象等。 深拷贝意味着拷贝了资源和指针,而...

    java初学者必看

    最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家...18.3 业务处理 18.3.1 实体类 18.3.2 数据处理 18.3.3 权限处理

    spring.net中文手册在线版

    通过构造器创建对象 4.2.3.2.通过静态工厂方法创建对象 4.2.3.3.通过实例工厂方法创建对象 4.2.4.泛型类的对象创建 4.2.4.1.通过构造器创建泛型类的对象 4.2.4.2.通过静态工厂方法创建泛型类的对象 4.2.4.3.通过...

    java 面试题 总结

    面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多...

    C++大作业-银行管理系统源代码

    (1)至少包含5个类(包含必要的构造函数和析构函数),使用面向对象程序设计思想实现; (2)要用到继承与派生,要用到多态(函数重载和虚函数都要有); (3)要有菜单选择项; (4)功能完整,设计简单的菜单...

    Java基础实战Bank项目文档需求源代码8个项目打包

    装性、构造器、引用类型的成员变量、异构数组、继承、多态、方法的重载、方 法的重写、包装类、单子模式、异常、集合。 2. 涉及较复杂业务: 以银行业务为背景,包含:添加客户,创建异构账户、存 钱、取钱、透支...

    jsp酒店管理系统+sqlserver2005

    控制层:使用JDBC直连的方法,对数据表的基本操作创建接口放在DAO包中,并创建它的实现方法,再用biz类继承DAO的接口并调用DAO的对象实现业务层的操作。 视图层:使用JSP,JSTL,EL,JavaScript的技术,使页面完全的...

    软件设计规范

    软件从模拟现实对象的过程中继承了其结构。 工业控制也开启了新的软件世界,因为软件要从分离的输入建立“综合感知”,感知到设备状态,然后做出响应。 软件有其固有的物理属性,也就是计算的量。算法领域,无论...

    JAVA面试题最全集

    如何构造一棵树?选择树的一个节点时,如何得到这个节点? 70.向编辑框中输入字符时,如何控制只输入整数? 71.描述使用JDBC连接数据库的过程 72.EJB分为几类?什么是BMP,CMP? 73.什么是JNDI? 74.ADO是什么?...

    C++大作业-银行管理系统课程设计报告

    (1)至少包含5个类(包含必要的构造函数和析构函数),使用面向对象程序设计思想实现; (2)要用到继承与派生,要用到多态(函数重载和虚函数都要有); (3)要有菜单选择项; (4)功能完整,设计简单的菜单...

    从J2SE到J2EE知识点介绍

    3. 如何写自定义action,实体,以及业务类 141 (二) Struts2 153 1. struts2的拦截器定义以及使用 153 2. struts标签 160 3. Struts 2 标签库说明及使用 160 4. set 描述 169 5. text 描述 170 6. property 描述 170...

    抽象类和接口的区别

    在 面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。 并不是 所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象, 这样的类就是抽象类。抽象类...

Global site tag (gtag.js) - Google Analytics