`

你能用Wapper来做什么?

阅读更多

 从简单的说起:
一、在只有值传递的语言中,通过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和总线优先级

    - **替换策略**:发生Cache缺失时,从外部存储器连续读取4个字的存储内容,并使用LRU算法进行替换。 ##### 3. Cache禁止操作 - **禁用方法**: - 通过设置SYSCFG寄存器中的CM位为00来禁用Cache。 - 或者设置...

    sqlite wapper类

    包括下面的文件:sqlite3.lib sqlite3.dll sqlite3.h SQLiteOper.h SQLite3Table.h SQLite3Statement.h SQLite3Query.h SQLite3Exception.h SQLite3Buffer.h SQLite3Binary.h 操作应用 使用教程

    监控web服务器日志;程序订制为windows服务;wrapper

    2. 配置wrapper:每个工具都有其特定的配置文件,你需要编辑这些文件来指定要运行的程序路径、服务名称、启动参数等。 3. 创建服务:使用wrapper工具提供的命令行工具或者图形界面,将你的程序注册为Windows服务。 4...

    matlab开发-cs2cswrapperformeatlab公司

    总的来说,cs2cswrapper for MATLAB是连接MATLAB与CS2CS库的桥梁,使得MATLAB用户可以方便地在MATLAB环境中进行复杂的坐标转换任务,对于地理信息处理和GIS应用开发具有很高的实用价值。通过对cs2cs.m文件的深入理解...

    SQLite Wrapper COM

    SQLite wrapper class this is very useful for working with vb6 and sqlite without odbc driver dependency

    BPMWrappers:使用BPM技术的Wapper项目

    **BPMWrappers: 使用BPM技术的Wrapper项目** BPMWrappers是一个专注于利用Business Process Management(业务流程管理)技术的Wrapper项目。该项目的核心目的是为了简化业务流程的自动化和集成,通过封装各种业务...

    unionpay_open:Ruby wapper适用于银联的Open API

    UnionpayOpenRuby wapper for Unionpay(银联支付)'s Open API.InstallationAdd this line to your application's Gemfile:gem 'unionpay_open'# orgem 'unionpay_open', :git =&gt; 'git://github....

    RDP Wrapper解决win10多用户问题

    我只提供给你我已经更新的10.10日版rdpwrap.ini,你自己去覆盖(会提示文件占用,你要先去关闭RDP服务,覆盖好后再去开启RDP服务即可) 友情提示,这东西会随着windows补丁升级有可能失效,一旦失效你要手动去update...

    java-atk-wrapper-0.33.2-6.el8.aarch64.rpm

    离线安装包,亲测可用

    altstrade:ALTS.Trade REST API node.js wapper

    "JavaScript"标签表明这个项目是用JavaScript语言编写的,JavaScript是Web开发中最常用的脚本语言,尤其适用于前端开发,但在这里它是用于后端开发,通过Node.js环境来实现与服务器的交互。 **压缩包子文件的文件...

    win远程多用户rdpwrap配置文件(6.1.7601.24326)_wrap gifts

    不仅能够帮助企业和个人更加高效地进行远程协作和支持,还能简化资源管理流程。对于那些希望突破Windows系统默认限制的用户来说,RDPWrap绝对是一个值得考虑的选择。当然,在使用过程中还需注意安全性和合规性方面的...

    nodeactyl.js:翼手龙API Wapper for JavaScript

    nodeactyl.js( ) JavaScript的开源翼手龙API包装器。 应用: 地点 创造 用户 服务器 删除 用户 ... 获取所有nodes , users , servers , nests , locations 。... const api = require ( 'nodeactyl.js' ) ....

    RimWorld-Wrapper:永远不要两次启动RimWorld

    我你和我一样,你对mod没有自制力。 不断向RimWorld添加mod的问题是您必须启动游戏才能激活新的mod。 这使启动游戏的时间增加了一倍,并且在激活了数百个mod的同时,开始时间已经很长了。 我为我自己创建了这个...

    C#实现的 ffmpeg

    在C#中实现FFmpeg,通常是为了利用其功能来在.NET环境中处理多媒体文件。SharpFFmpeg 是一个针对C#的FFmpeg绑定库,它允许开发者在C#应用中无缝地调用FFmpeg的功能。 首先,我们需要理解FFmpeg的核心组件。FFmpeg ...

    PPC Keyword Wrapper for Google & Bing Ads-crx插件

    v1.3中的新增功能:-添加了十个单词限制选项(不能添加超过十个单词的关键字)-进一步减少了输出中的不必要空间-添加了指向AutomatingAdWords.com的链接-删除了可以加快速度的日志一点点-更新了权限(删除了权限)v...

    win远程多用户rdpwrap配置文件(10.0.19042.1052)

    win10多用户、远程、rdp配置文件 配置文件已测试 能正常使用

    Node-Xbmc-Wapper:XBMC JSON-RPC api 的节点客户端

    与其他包装器不同,函数是从服务 JSONRPC.Introspect 端点动态生成的好处函数是动态生成的用不到 100 行代码访问所有 273 个 api 调用!例子调用函数 var config = { XbmcHost : "127.0.0.1" , XbmcPort : 8081 , ...

    svnwrapper:颠覆 svn 命令的小包装器

    Subversion 的 svn 命令的一些包装命令。 取自:- 添加命令:- addall - 添加所有未跟踪的文件。 diffc - 颜色差异,需要 colordiff - sudo apt-get install colordiff。 修改的:- ci - 在传递给真正的 svn ...

    engine_wrapper

    "engine_wrapper"是一个在...综上所述,"engine_wrapper"是C++编程中一个重要的设计模式,它通过提供一个友好的接口来简化对复杂引擎的使用。理解并掌握如何设计和实现这样的包装器是提升C++项目开发能力的关键步骤。

Global site tag (gtag.js) - Google Analytics