类包装的方式

原创 2007年09月14日 10:52:00
   在 长期的工作过程中,经常需要包装第三方库提供的类.在多次这样做以后,发现要很好的包装一个第三方的库。需要包装两次。
   第一层  提供辅助功能类(Helper 类 ).例如我在包装ArcEngine的 Workspace的时候就提供了一个DatabaseHelper类直接操作Workspace做我需要做的工作 。在这个层面上,代码的客户端是知道ArcEngine的Workspace的。而且在调用包装后代码的过程中还需要客户端提供Workspace本身.
  第二层 提供封装类。在同一个项目中 我提供了另一个类DJWorkspace 用来完全封装Workspace.从打开Workspace的过程起开始封装,将日常所需要的功能都有这个类来提供。同时这个类的实现实际上上第一层的客户。当需要什么功能的时候直接调用,然后再处理。
    在第二层由于不是完全封装,所以需要提供一个暴露底层Workspace的机会。另外,一定要有某种形式来告知DJApplication的客户:不要长时间保留底层Workspace的引用,最好每次使用都从DJApplication获取。这个是很重要的。
举例如下:
我们要获取一个Workspace中所有的FeatureClass的短名称 (没有用户名的那种)
在 DatabaseHelper中:
 
public static StringCollection QueryFeatureClassName(IWorkspace pWorkspace)
        
...{
            String ownerName
="";
            
if(pWorkspace.Type==esriWorkspaceType.esriRemoteDatabaseWorkspace)
            
...{
                ownerName
=pWorkspace.ConnectionProperties .GetProperty ("user").ToString ();
                ownerName
=ownerName.ToUpper ()+".";
            }

            StringCollection sc
=new StringCollection ();
            IEnumDatasetName edn
=pWorkspace.get_DatasetNames (esriDatasetType.esriDTFeatureDataset);
            IDatasetName dn
=edn.Next ();
            
while(dn!=null
            
...{
                
string dsName=dn.Name.ToUpper ();
                
if(ownerName.Equals (LayerHelper.GetClassOwnerName(dsName))) 
                
...{
                    sc.Add (LayerHelper.GetClassShortName(dsName) );
                }

                dn
=edn.Next ();
            }

            
return sc;
        }
而在 DJWorkspace的实现者之一OracleWorkspace中有如下代码 :
public StringCollection GetFeatureDatasetNameCollection() 
        
...{
            
return DatabaseHelper.QueryFeatureClassName(this.SDEWorkspace);
        }

  我们在第二个类里面仅仅直接调用了Helper类的函数。
 为什么要这样做呢?原因其实很简单:
   1.我们的不同的DJWorkspace的实现者可能需要的GetFeatureDatasetNameCollection()方法其实实现是类似的。由于ArcEngine中的Workspace本身就是一个适应很广泛的接口。这样情况是存在的。
 2.我们在写一些底层模块的时候可能会用到Helper类,而不是高层的包装类。高层的包装往往已经和业务有关系了。但是底层的模块确没有。这样底层的模块不可能为了使用第二层包装类里面的一个功能而导致自己依赖于它。这样做是不可取的。
   所以将包装的过程分为两个层次是有必要的。在实际工作中也体现了它比一层包装要灵活得多。

java基本类型和包装器类【转】

简要讲述java基本类型和包装类型,为装箱和拆箱的学习做准备
  • call_from_dream
  • call_from_dream
  • 2015年09月29日 18:10
  • 825

C++函数包装器

函数包装器把函数包装起来:有以下特点 1.设计通用的函数执行接口,可以设置计数(函数执行次数)和关卡 2.函数包装器依赖于函数模板,实现通用泛型 3.函数代码可以内嵌在函数中 4.原理是函数指...
  • huangshanchun
  • huangshanchun
  • 2015年05月11日 20:00
  • 3056

Java 原生类型与包装器类型深度剖析

本文对 Java 原生类型与包装器类型进行深度剖析,主要涉及以下四个方面:原生类型与包装器类型基础、字面值概念和种类、 基本类型的自动转型与强制转型 和自动装箱与拆箱机制。...
  • justloveyou_
  • justloveyou_
  • 2016年09月24日 16:05
  • 1191

浅谈JAVA中包装器类型

1. 为什么需要包装器类型 首先我们先来看一个表格。 以上是java中七种的基本类型以及对应的包装器对象类型,为什么java非要给七种基本类型构造出相应的包装器类...
  • geekerhw
  • geekerhw
  • 2015年07月28日 00:08
  • 1889

java入门学习(7)—包装类,object类

一、包装类:在java语言里,一切的东西都是对象,一切的类都是object的子类,但是总有那么那么几个是特殊的,其中基本数据类型是由C语言引用过来,并不是我们自己所说的对象,所以提供一个包装类,对其进...
  • newly123
  • newly123
  • 2016年01月18日 10:03
  • 471

【Mybatis升级版-04】包装类型pojo参数绑定

需求: 商品查询controller方法中实现商品查询条件传入。 实现方法: [1]在形参中,添加httpServletRequest request参数,通过request接收查询条件参数。【不推荐...
  • qq_28194557
  • qq_28194557
  • 2017年09月13日 20:13
  • 125

spark streaming + kafka

我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark streaming从kafka中不断拉取数据进行词频统计。本文首先对spark streaming嵌入kafka...
  • bsf5521
  • bsf5521
  • 2017年08月03日 16:31
  • 141

有了基本类型之后为什么还要有包装器类型呢?

有了基本类型之后为什么还要有包装器类型呢?核心:让基本类型具备对象的特征,实现更多的功能. Java是一个面相对象的编程语言,基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装...
  • wang_8649
  • wang_8649
  • 2017年05月15日 12:45
  • 506

C# 包装模式

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T...
  • cp790621656
  • cp790621656
  • 2015年11月03日 20:37
  • 1151

C++中类似printf的日志函数的包装

#include #include #include using namespace std; #define dbglog printlog void printlog(co...
  • duhaomin
  • duhaomin
  • 2013年12月13日 17:44
  • 2315
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类包装的方式
举报原因:
原因补充:

(最多只允许输入30个字)