`
liulanghan110
  • 浏览: 1076040 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

代理模式的运用(续)

    博客分类:
  • JAVA
 
阅读更多

动态代理的核心是InvocationHandler接口,要使用动态代理就必须实现该接口。这个接口的委派任务是在invoke(Object proxy, Method m, Object[] args)方法里面实现的:


//在调用核心功能之前作一些动作
……
//调用核心功能
m.invoke(obj, args);
//在调用核心功能以后做一些动作
……
    我们可以看到动态代理其实用的是反射机制来调用核心功能的:m.invoke(obj, args);正是这种反射机制的使用使得我们调用核心功能更加灵活,而不用依赖于某一个具体的接口,而是依赖于Object对象。

    下面我们来具体看看动态代理或动态委派如何使用:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface   DoAction{
	public void ViewAction();
	public void AddAction();
}

class DoActionImpl implements DoAction {
	
	public void ViewAction(){
		System.out.println("查看信息!");
	}
	
	public void AddAction(){
		System.out.println("添加信息!");
	}
}


class ProxyAction implements InvocationHandler {
	private Object action;
	private User user = new User() ;
	
	public ProxyAction(Object action) {
		this.action = action;
	}

	public static Object getInstance(Object action) {
		return Proxy.newProxyInstance(action.getClass().getClassLoader(),
				action.getClass().getInterfaces(), new ProxyAction(action));
	}

	public Object invoke(Object proxy, Method m, Object[] args)
			throws Throwable {

		Object result = null;
		try {
			// 在委派之前作动作,如权限判断等
			if(user.getPermission().equals(m.getName())){
			}else{//没权限,不执行委派
				return result;
			}
			// 进行委派
			result = m.invoke(action, args);

		} catch (InvocationTargetException e) {

			throw e.getTargetException();

		} catch (Exception e) {

			throw new RuntimeException("unexpected invocation exception: "

			+ e.getMessage());

		} finally {
			// 在委派之后做动作

		}

		return result;

	}

}

//用户信息
class User{
	private String permission = "ViewAction" ;

	public String getPermission() {
		return permission;
	}

	public void setPermission(String permission) {
		this.permission = permission;
	}
}

public class proxy {
	public static void main(String[] args) {

		DoAction action =(DoAction) ProxyAction.getInstance(new DoActionImpl());
		action.ViewAction();
	}
}
 这个代理类,首先是实现了InvocationHandler接口;然后在getInstance()方法里得到了代理类的实例;在invoke()方法里实现代理功能,也很简单。

    下面我们来看客户端:
Action action = (Action)ProxyAction.getInstance(new ViewAction());
Action.doAction();

    我们可以看到代理类对接口的依赖也转移到了客户端上,这样,代理类不依赖于某个接口。对于同样的代理类ProxyAction,我们也可以有如下的客户端调用:
Engine engine = (Engine)ProxyAction.getInstance(new EngineImpl());
Engine.execute();

    只要engineImpl类实现了Engine接口,就可以像上面那样使用。

    现在我们可以看到,动态代理的确是拥有相当的灵活性。

分享到:
评论

相关推荐

    二十三种设计模式【PDF版】

    以 Jive 为例,剖析代理模式在用户级别授权机制上的应用 设计模式之 Facade(门面?) 可扩展的使用 JDBC针对不同的数据库编程,Facade提供了一种灵活的实现. 设计模式之 Composite(组合) 就是将类用树形结构组合成...

    设计模式可复用面向对象软件的基础.rar

    结构型模式如适配器模式、装饰器模式、代理模式等,关注如何将不同的类或对象组合在一起,形成新的结构或功能。行为型模式如策略模式、观察者模式、职责链模式等,关注对象之间的交互和行为分配。 例如,工厂模式...

    数据库营销在报业广告经营中的运用

    - **《萨克拉门托蜜蜂报》**:利用数据库识别出可能不再订阅的客户,通过电话沟通等方式挽留客户,显著提高了续订率。 - **《读卖新闻》**:不仅收集了丰富的读者数据,还将其应用于广告销售中,使得数据库营销成为...

    毕业设计-酒店管理系统

    同时,设计模式如工厂模式、单例模式、代理模式等的运用,提高了代码的可读性和可维护性。 六、安全性与性能优化 .NET框架提供了强大的安全机制,如身份验证、授权、加密等。在性能优化方面,可以利用缓存策略、...

    windows wget.exe免费下载

    wget支持HTTP、HTTPS和FTP协议,同时也能够处理重定向、通过代理服务器工作、断点续传以及在后台运行等特性。 在Windows系统中,wget.exe可能不作为内置工具提供,但可以通过安装第三方软件或者从GNU wget项目官网...

    wget_wget_

    10. **断点续传**:当下载过程中断,可以使用`-c`选项继续之前的下载,节省带宽和时间。 11. **文件大小限制**:`--max-filesize`选项允许设定最大下载文件大小,防止意外下载过大的文件。 12. **日志与输出**:`-...

    Peergine编程手册.pdf

    - **文件传输类**:提供PUT和GET方式的文件传输,支持断点续传。 - **音频传输类**:支持实时音频捕捉和传输,适用于两点对话和多点会议,包括发言控制、音量显示和录音功能。 - **视频传输类**:包括本地预览、...

    ftp上传工具

    6. **防火墙和代理支持**:对于那些需要通过防火墙或代理服务器访问FTP服务的情况,FlashFXP也能顺利应对。 7. **实时文件预览**:在上传前,用户可以查看远程服务器上的文件,确保正确无误。 8. **文件同步**:...

    网络游戏运营全流程认识.pdf

    - 产品创新性:新颖的游戏类型和模式能提升产品的竞争力,但接受度难以预测。 - 流行产品续作:有前作基础的游戏更容易吸引用户并占据市场份额。 - 品牌知名度:知名产品进入市场更易,营销成本相对较低。 - ...

    2021版本Java程序月薪30k简历模板.docx

    - 余胜军在简历中强调了对JavaSE基础知识的熟练掌握,包括面向对象分析和设计能力,熟悉各种设计模式,如代理、单例、工厂、建造者、观察者、策略、模版、装饰、门面等。 - 此外,他还精通Java中的反射、自定义...

    如何挖掘客户的需求.PPT

    - **数据分析**:运用数据分析工具,从大量数据中洞察客户需求模式。 - **定制化服务**:根据每个客户的具体情况,提供个性化解决方案。 总之,挖掘客户需求是一个综合性的过程,需要技术、沟通和策略的结合。...

    JAVA 范例大全 光盘 资源

    实例117 代理服务器的实现 340 实例118 IP多点传送(基于UDP的C/S) 345 第14章 线程 350 实例119 启动和停止线程 350 实例120 多线程同步方法 352 实例121 取钱存钱(线程同步互斥) 354 实例122 谁唤醒了我...

    curl教程详解.pdf

    - **断点续传**:使用`-C`选项可以实现下载的断点续传。 ``` curl -C - -o filename https://www.example.com/large-file ``` - **并发请求**:通过管道和`xargs`命令可以实现并发请求。 ``` urls=(url1 url2...

    FTP命令详解.txt

    - **proxy ftp-cmd**:在代理服务器环境中使用,执行一个FTP命令,通常用于在需要代理的情况下打开连接。 - **put local-file [remote-file]**:上传本地文件到远程服务器。 - **pwd**:显示远程服务器当前所在的...

    pycurl-7.43.0.3-cp37-cp37m-win32.whl

    4. **异步操作**:使用libcurl的非阻塞模式,pycurl可以在单线程中并发处理多个请求,实现高效的多任务处理。 5. **SSL/TLS安全**:pycurl支持SSL和TLS加密,确保数据在传输过程中的安全性。 6. **代理服务器**:...

    FlashFXP使用教程.rar

    FlashFXP是一款功能强大的...通过本教程的学习,用户将能够熟练运用FlashFXP进行各种FTP操作,无论是日常的文件传输,还是专业的网站维护,都能游刃有余。请参照教程中的步骤,结合实际操作,逐步提升在FTP领域的技能。

    wget.exe cmd下载网络图片

    8. **用户代理伪装**:有些网站可能需要特定的用户代理才能访问,`--user-agent`或`-U`参数可以帮助你伪装成其他浏览器: ``` wget --user-agent="Mozilla/5.0" [URL] ``` 9. **保存日志**:`wget`允许记录下载...

    xiazai.rar_Java编程_Java_

    在本压缩包“xiazai.rar”中,包含的是一套简单的Java...通过研究这些代码,初学者可以了解到如何在实际项目中运用Java进行文件下载的程序设计,而有经验的开发者则可以借鉴其中的设计模式和技巧,提升自己的编程技能。

    详解Linux中的wget命令

    ### 详解Linux中的wget命令 #### 一、简介 在Linux系统中,`wget`是一个极为重要的命令行工具,主要用于从互联网上下载文件。对于Linux用户来说,掌握`...在未来的工作中,灵活运用这些功能将大大提高您的工作效率。

Global site tag (gtag.js) - Google Analytics