`
canonical
  • 浏览: 367009 次
  • 性别: 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.

分享到:
评论

相关推荐

    c#中的面向对象继承

    通过理解和熟练运用这些概念,开发者能够构建出符合业务需求、高效运行的.NET应用程序。在学习过程中,结合实例和视频教程(如“传智播客.Net培训—C#面向对象基础”系列课程)会有助于更好地理解这些概念。同时,...

    Mybatis表对象继承实现

    子类如`Organization`、`Department`、`Post`,这些子类在结构上类似,它们根据实际需要继承基类的属性,并且可以通过构造函数传递类型信息给基类。 特别地,对于包含特有属性的子类,如`Person`类,除了继承基类...

    面向对象软件构造-delphi技术资料

    面向对象软件构造是一种现代软件开发方法,它基于面向对象编程(OOP)的概念,强调将现实世界中的问题抽象为对象,通过对象之间的交互来解决问题。Delphi是一款强大的集成开发环境(IDE),它以其高效的编译器和VCL...

    Rose实例+构造银行业务模型

    通过"Rose实例+构造银行业务模型.doc"这个文档,你将能够看到上述各种UML图的实际应用,学习如何使用Rose工具创建和编辑这些图,以及如何利用这些图来表达和分析银行业务模型。这个过程不仅可以加深对UML的理解,也...

    面向对象软件构造object-oriented software construction

    在OOSC中,软件被组织成一系列相互协作的对象,这些对象通过封装、继承和多态等机制来实现复杂的功能。 1. 封装:封装是面向对象的核心特性之一,它将数据和操作这些数据的方法捆绑在一起,形成一个独立的单元——...

    通过实例来剖析C#继承机制

    在`案例3:通过实例来剖析C#继承机制`中,你可能将看到如何创建一个实际的继承链,如何调用父类和子类的方法,以及如何利用继承实现特定的业务逻辑。通过这种方式,你可以更深入地理解C#继承的实际应用和优势。 总...

    ATL 揭秘之“对象创建”篇

    ### ATL揭秘之“对象创建”篇 当我们使用Visual C++的ATL...它隐藏了对象创建的具体细节,允许开发者专注于业务逻辑而不必担心底层实现。通过理解ATL的工作原理,我们可以更好地利用其功能,提高开发效率和代码质量。

    Java面向对象程序设计类的继承.ppt

    3. 构造器:子类不直接继承父类的构造器,但可以在自己的构造器中通过`super()`调用来调用父类的构造器,以初始化从父类继承的属性。 在给定的汽车管理系统示例中,我们可以定义一个`Vehicle`类,包含描述车辆的...

    PHP面向对象详解

    面向对象编程是一种编程范式,它基于“对象”概念,通过封装、继承和多态等特性来设计和组织代码。在PHP中,每个类定义了一种数据类型,类可以包含属性(变量)和方法(函数),用于描述对象的状态和行为。 **封装*...

    深入理解持久化对象

    1. **提供无参数构造器**:这是Hibernate框架的基本要求之一,确保Hibernate能够通过反射机制创建对象实例。 2. **提供标识属性**:标识属性是对象唯一的标识,通常映射到数据库表中的主键字段。例如,在一个用户...

    js面向对象简单理解

    通过原型、构造函数和原型链,我们可以创建具有继承关系的对象,实现代码的复用和模块化。在实际开发中,理解并熟练掌握这些概念对于编写高效、可维护的JavaScript代码至关重要。通过阅读`prototype.js`这样的示例...

    JVM中对象的生命周期

    在此期间,对象可以被多个线程访问,参与方法调用,执行业务逻辑,存储数据等。 **不可视阶段(Invisible)** 当一个对象的引用不再被程序中的任何活动线程直接持有,但仍然可以通过其他方式(如软引用、弱引用、虚...

    面向对象的Jscript分析

    通过设置一个对象的原型为另一个对象,第一个对象就能继承第二个对象的所有属性和方法。此外,ES6引入了类和extend关键字,使得JScript的继承更加符合传统面向对象的语言风格。 5. **封装** 封装是面向对象的核心...

    面向对象程序设计教程与visual c++6.0教程 经典课件与试题 期末考试 本科

    你需要熟练掌握如何定义和初始化对象,如何编写构造函数和析构函数,理解虚函数和纯虚函数的作用,以及如何利用MFC创建窗口程序。 在准备考试的过程中,练习是至关重要的。通过解决课件中的习题和模拟试题,你可以...

    面向对象(西安电子科技大学陈平课件)

    8. **面向对象分析与设计**:OOA(面向对象分析)关注业务需求的建模,而OOD(面向对象设计)则关注如何将这些需求转化为软件结构。 9. **案例分析**:课程可能通过实际项目或例子,如学生管理系统、图形用户界面等...

    面向对象分析与设计试题与答案

    2. C++是一种混合性面向对象语言,它不仅支持传统的面向过程编程,还支持面向对象编程,具有广泛的应用基础和丰富的开发环境,对面向对象编程的普及起到了关键作用。 3. 面向对象技术的三大基本特征是封装、继承和...

    C#做的计算器,利用类的封装继承多态。。

    1. **类(Class)**:C#是一种面向对象的语言,类是它的基本构造块。在这个计算器项目中,可能定义了多个类,如`Calculator`、`Operation`等,用来表示不同的计算操作和整体的计算器结构。类帮助组织代码并提供数据和...

    13-面向对象-第5天(面向对象其他知识点)-讲义共7页

    在“13-面向对象-第5天(面向对象其他知识点)-讲义共7页”中,我们可以期待学习到面向对象编程的一些高级和扩展概念,这些可能包括但不限于继承、多态、抽象类、接口、封装、构造函数以及设计模式等。 首先,继承...

    QT窗口与业务逻辑分离

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

    面向对象程序设计与VC++实践

    VC++,全称Visual C++,是微软公司开发的一款强大的C++集成开发环境,它支持面向对象编程,并且提供了丰富的类库,如MFC(Microsoft Foundation Classes),方便开发者进行Windows应用程序的开发。 在学习面向对象...

Global site tag (gtag.js) - Google Analytics