从简单的说起:
一、在只有值传递的语言中,通过Wapper把实参Wapper之后,实现副作用:
在工具箱里写上我们要用的Wrapper:
public class Wrapper<T extends Object> {
public T object;
public Wrapper() {
object = null;
};
public Wrapper(T object) {
this.object = object;
}
}
下面我们看看一个从内部类获得副作用的例子:
由于内部类使用外部变量必须是final的,这样试图使用一个变量直接得到
内部类操作的结果不能够实现,这时候我们的Wrapper派上了用场:
final Wrapper<String> wrapper = new Wrapper<String>();
Display.getDefault().syncExec(new Runnable() {
public void run() {
wrapper.object = ....;
}
}
我们可以成功的从一个内部类中获得我们需要的数据。
下面我们看一个经典的swap函数:
void swap(int a,int b){
int temp = a;
a = b;
b = temp;
}
这个简单的swap函数不起作用的,而java等语言参数传递只支持值传递,
所以不管是参数是基本类型还是Object类型,都不能写出可以swap两个值的函数。
如果我们非得想有这么一个swap函数来交换两个值,那该怎么办?这时候wapper又派上用场了。
在我们的工具箱找到Wrapper:
写我们的交换函数:
void swap(Object a,Object b){
Object temp = a.value;
a.value = b.value;
b.value = temp;
}
String a = "abc";
String b = "bcd";
Wrapper<String> wrapperA = new Wrapper<String>(a);
Wrapper<String> wrapperB = new Wrapper<String>(b);
swap(wrapperA,wrapperB);
在用javascript写XPCOM的时候,数组及其大小作为返回值(由于idl与实现语言无关,
需要返回数组的大小),两个返回值,javascript是不支持的,并且在javascript
只有值传递的语言,使用参数直接作为返回值是不能实现的,这时候Wapper就派上了
用场:
idl:
void getArray(out unsigned long count,[retval, array, size_is(count)] out string aArray);
js实现:
getArray: function(aCount){
aCount.value = this.aArray.length;
return this.aArray;
};
使用方法:
var aCount = {};一个Wapper
var array = xx.getArray(aCount);
xxx.alert(aCount.length);
二、控制实例产生的个数/生命周期:
最常见的一个Wrapper要算单例模式了:
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return instance;
}
}
这个Wrapper或许有点特别,自己Wrapper自己,来控制实例产生的个数/生命周期。
上次写了一个获取Post数据的firefox插件,XPCOM nsPostDataManager最早使用:
var catman = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager);
catman.addCategoryEntry("JavaScript global property",
CLASS_NAME,
CONTRACT_ID,
true,
true);
来注册。
这样可以在网页全局访问getPostData和clearRequests接口方法。但是结果去每次都为空,跟踪发现
每打开一个新的Tab页,nsPostDataManager就会有一个新的实例生成,从而使得收集post请求的实例,
和在页面要使用的实例不是一个。这时候Wrapper又可以出头露面了,再写一个Wrapper组件nsPostDataService::
getPostData: function(aCount){
//在XPCOM中getService每次使用一个实例,而createInstance每次创建一个实例
var nsPostDataManager = Cc["@ibm.com/nspostdatamanager;1"].getService(Ci.nsIPostDataManager);
return nsPostDataManager.getPostData(aCount);
},
clearRequests: function(){
var nsPostDataManager = Cc["@ibm.com/nspostdatamanager;1"].getService(Ci.nsIPostDataManager);
return nsPostDataManager.clearRequests();
}
这时候把nsPostDataService注册成网页全局访问的就可以了。
三、控制对象的访问:
Proxy模式其实也是一个Wrapper,通过Wrapper这个对象来控制对象的访问,并转发消息到实际对象。
四、为对象动态增加行为:
Proxy模式的动态代理可以实现AOP,为对象动态增加行为。Spring的AOP就是使用了Java动态代理。
装饰模式可以动态的Wrapper对象,来为对象增加行为:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
Extension Object模式则可以为Object动态添加新的行为而不改变已有的接口,然后Query到需要的接口,使用新行为。
Wrapper还有很多使用的场合,希望大家补充。
分享到:
相关推荐
44B0中文数据手册\S3C44B0处理器Wapper和总线优先级.pdf
包括下面的文件:sqlite3.lib sqlite3.dll sqlite3.h SQLiteOper.h SQLite3Table.h SQLite3Statement.h SQLite3Query.h SQLite3Exception.h SQLite3Buffer.h SQLite3Binary.h 操作应用 使用教程
BPMWrappers 使用BPM技术的Wapper项目
用于将程序发布为windows服务,并且可以对web服务日志进行监控,并执行停止、重启等命令。
matlab开发-cs2cswrapperformeatlab公司。这是要调用的包装函数
SQLite wrapper class this is very useful for working with vb6 and sqlite without odbc driver dependency
替代品ALTS.Trade REST API node.js wapper 使用 npm 安装包: npm install altstrade
UnionpayOpenRuby wapper for Unionpay(银联支付)'s Open API.InstallationAdd this line to your application's Gemfile:gem 'unionpay_open'# orgem 'unionpay_open', :git => 'git://github....
离线安装包,亲测可用
nodeactyl.js( ) JavaScript的开源翼手龙API包装器。 应用: 地点 创造 用户 服务器 删除 用户 ... 获取所有nodes , users , servers , nests , locations 。... const api = require ( 'nodeactyl.js' ) ....
我你和我一样,你对mod没有自制力。 不断向RimWorld添加mod的问题是您必须启动游戏才能激活新的mod。 这使启动游戏的时间增加了一倍,并且在激活了数百个mod的同时,开始时间已经很长了。 我为我自己创建了这个...
v1.3中的新增功能:-添加了十个单词限制选项(不能添加超过十个单词的关键字)-进一步减少了输出中的不必要空间-添加了指向AutomatingAdWords.com的链接-删除了可以加快速度的日志一点点-更新了权限(删除了权限)v...
与其他包装器不同,函数是从服务 JSONRPC.Introspect 端点动态生成的好处函数是动态生成的用不到 100 行代码访问所有 273 个 api 调用!例子调用函数 var config = { XbmcHost : "127.0.0.1" , XbmcPort : 8081 , ...
Spring2.5各个包的作用详解 (1) spring-core.jar (2) spring-beans.jar (3) spring-aop.jar .... Spring包依赖说明: 1) spring-core.jar需commons-collections.jar,spring-core.jar是以下其它各个的基本。...
Subversion 的 svn 命令的一些包装命令。 取自:- 添加命令:- addall - 添加所有未跟踪的文件。 diffc - 颜色差异,需要 colordiff - sudo apt-get install colordiff。 修改的:- ci - 在传递给真正的 svn ...
(熬夜做成,希望多多看看,有一处错误,把单词wapper改为webapps,敬请原谅) 目录大纲: 一、 配置。 1.1 Axis2(Eclipse)插件的安装。 1.2 Axis2.war的安装。 1.3 Eclipse Build Path。 二、 Web Service服务器端的...
Go OpenTracing API的Jaeger绑定 实现Jaeger的 Tracer的工具库( )。 重要信息:库的导入路径... 我们可能会在下一个主要版本中对此进行重新讨论。 ...如何贡献 ...当将此库包含到应用程序中时,建议使用诸如和类的依赖项管
engine_wrapper
将选定的符号和/或符号实例交换到另一个母版,或交换整个库。 用法 cmd选项移位w-将选定的符号和/或符号实例交换到另一个主对象 cmd option shift b-将所有符号从一个库交换到另一个库 安装 自动 ...
uiautomatorSampleCodes 这是用于安装指定应用程序的纯UI工作流的简单示例代码。 它包括设备检查,网络检查,卸载应用程序,下载应用程序,安装应用程序...但是无论如何,它只是为您提供参考。