从简单的说起:
一、在只有值传递的语言中,通过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还有很多使用的场合,希望大家补充。
分享到:
相关推荐
- **替换策略**:发生Cache缺失时,从外部存储器连续读取4个字的存储内容,并使用LRU算法进行替换。 ##### 3. Cache禁止操作 - **禁用方法**: - 通过设置SYSCFG寄存器中的CM位为00来禁用Cache。 - 或者设置...
包括下面的文件:sqlite3.lib sqlite3.dll sqlite3.h SQLiteOper.h SQLite3Table.h SQLite3Statement.h SQLite3Query.h SQLite3Exception.h SQLite3Buffer.h SQLite3Binary.h 操作应用 使用教程
2. 配置wrapper:每个工具都有其特定的配置文件,你需要编辑这些文件来指定要运行的程序路径、服务名称、启动参数等。 3. 创建服务:使用wrapper工具提供的命令行工具或者图形界面,将你的程序注册为Windows服务。 4...
总的来说,cs2cswrapper for MATLAB是连接MATLAB与CS2CS库的桥梁,使得MATLAB用户可以方便地在MATLAB环境中进行复杂的坐标转换任务,对于地理信息处理和GIS应用开发具有很高的实用价值。通过对cs2cs.m文件的深入理解...
SQLite wrapper class this is very useful for working with vb6 and sqlite without odbc driver dependency
**BPMWrappers: 使用BPM技术的Wrapper项目** BPMWrappers是一个专注于利用Business Process Management(业务流程管理)技术的Wrapper项目。该项目的核心目的是为了简化业务流程的自动化和集成,通过封装各种业务...
UnionpayOpenRuby wapper for Unionpay(银联支付)'s Open API.InstallationAdd this line to your application's Gemfile:gem 'unionpay_open'# orgem 'unionpay_open', :git => 'git://github....
我只提供给你我已经更新的10.10日版rdpwrap.ini,你自己去覆盖(会提示文件占用,你要先去关闭RDP服务,覆盖好后再去开启RDP服务即可) 友情提示,这东西会随着windows补丁升级有可能失效,一旦失效你要手动去update...
离线安装包,亲测可用
"JavaScript"标签表明这个项目是用JavaScript语言编写的,JavaScript是Web开发中最常用的脚本语言,尤其适用于前端开发,但在这里它是用于后端开发,通过Node.js环境来实现与服务器的交互。 **压缩包子文件的文件...
nodeactyl.js( ) JavaScript的开源翼手龙API包装器。 应用: 地点 创造 用户 服务器 删除 用户 ... 获取所有nodes , users , servers , nests , locations 。... const api = require ( 'nodeactyl.js' ) ....
不仅能够帮助企业和个人更加高效地进行远程协作和支持,还能简化资源管理流程。对于那些希望突破Windows系统默认限制的用户来说,RDPWrap绝对是一个值得考虑的选择。当然,在使用过程中还需注意安全性和合规性方面的...
我你和我一样,你对mod没有自制力。 不断向RimWorld添加mod的问题是您必须启动游戏才能激活新的mod。 这使启动游戏的时间增加了一倍,并且在激活了数百个mod的同时,开始时间已经很长了。 我为我自己创建了这个...
v1.3中的新增功能:-添加了十个单词限制选项(不能添加超过十个单词的关键字)-进一步减少了输出中的不必要空间-添加了指向AutomatingAdWords.com的链接-删除了可以加快速度的日志一点点-更新了权限(删除了权限)v...
在C#中实现FFmpeg,通常是为了利用其功能来在.NET环境中处理多媒体文件。SharpFFmpeg 是一个针对C#的FFmpeg绑定库,它允许开发者在C#应用中无缝地调用FFmpeg的功能。 首先,我们需要理解FFmpeg的核心组件。FFmpeg ...
win10多用户、远程、rdp配置文件 配置文件已测试 能正常使用
与其他包装器不同,函数是从服务 JSONRPC.Introspect 端点动态生成的好处函数是动态生成的用不到 100 行代码访问所有 273 个 api 调用!例子调用函数 var config = { XbmcHost : "127.0.0.1" , XbmcPort : 8081 , ...
Subversion 的 svn 命令的一些包装命令。 取自:- 添加命令:- addall - 添加所有未跟踪的文件。 diffc - 颜色差异,需要 colordiff - sudo apt-get install colordiff。 修改的:- ci - 在传递给真正的 svn ...
"engine_wrapper"是一个在...综上所述,"engine_wrapper"是C++编程中一个重要的设计模式,它通过提供一个友好的接口来简化对复杂引擎的使用。理解并掌握如何设计和实现这样的包装器是提升C++项目开发能力的关键步骤。