`
wangchao_17915566
  • 浏览: 169507 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

了解代理模式

阅读更多

简单的了解下代理模式

代理就是一个人或一个机构代表另一个人或者机构采取行动。在一些情况下,一个客户不想或不能够直接引用对象,而代理对象可以在客户端和目标对象之间起到中介作用

     代理模式包括远程代理,虚拟代理,copy-on-write代理,保护代理,catch代理,防火墙代理,同步化代理,只能引用代理,这些我就不一一介绍,我只是用简单例子,了解什么是代理模式。

     代理模式设计到的角色:

     抽象主题角色:声明了真是主题和代理主题的公共接口,这样可以使用真实主题的地方都可以使用代理主题。

     代理主题角色:代理主题角色内不含有真实主题的引用,从而可以在任何时刻操作真实主题对象,代理主题角色提供一个与真实主题相同的接口,可以在任何时刻替代真实主题控制真实主题引用,负责在需要的时候创建真实主题对象(和删除真实主题对象),代理角色通常再将客户端调用传递给真实主题之前,或之后,都执行谋个操作,而不是单纯的将调用传递给真实主题。

      真实主题角色:定义了代理角色所代表的真实对象

根据例子看看:

abstract public class Subject {
	//定义抽象请求方法
	abstract public void request();
}

 真实主题

public class RealSubject extends Subject{

	public RealSubject(){
		
	}
	public void request() {
		// TODO Auto-generated method stub
		System.out.println("请求");
	}

}

 

代理主题

public class ProxySubject extends Subject{

	private RealSubject realSubject;
	public ProxySubject(){
		System.out.println("进入代理类.......");
	}
	@Override
	public void request() {
		// TODO Auto-generated method stub
		preRequest();
		if(realSubject==null){
			realSubject = new RealSubject();
		}
		realSubject.request();
		postRequest();
	}
	/**
	 * 请求前操作
	 * */
	private void preRequest(){
		System.out.println("请求前");
	}
	/**
	 * 请求后操作
	 * */
	private void postRequest(){
		System.out.println("请求后");
	}

}

 

测试代理

public class TestProxy {
	public static void main(String[] args) {
		Subject s = new ProxySubject();
		s.request();
	}

}

 代理模式的时序图。

 

从这个测试不难看出代理类的作用,代理主题并不改变主题接口,模式的用意是不让客户端感觉到代理的存在,其次,代理使用委派将客户端的调用委派给真实主题对象,代理主题起到的是一个传递作用;最后,代理主题在传递请求之前和之后都可以执行特定的操作,而不是单纯的传递请求。

 

接下来说说动态代理模式

public class VectorProxy implements InvocationHandler{

	private Object proxyobj;
	
	public VectorProxy(Object obj){
		proxyobj = obj;
	}
	
	public static Object factory(Object obj){
		Class cls = obj.getClass();
		return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),new VectorProxy(obj));

	}
	/**
	 * 调用某个方法
	 * */
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("before calling"+method);
		if(args!=null){
			for(int i=0;i<args.length;i++){
				System.out.println(args[i]);
			}
		}
		Object o = method.invoke(proxyobj, args);
		System.out.println("after calling"+method);
		return o;
		
	}
	
	public static void main(String[] args){
		List<String> v = null;
		v = (List) VectorProxy.factory(new Vector(10));
		v.add("New");
		v.add("York");
	}
}

 

运行结果:

before callingpublic abstract boolean java.util.List.add(java.lang.Object)
New
after callingpublic abstract boolean java.util.List.add(java.lang.Object)
before callingpublic abstract boolean java.util.List.add(java.lang.Object)
York
after callingpublic abstract boolean java.util.List.add(java.lang.Object)

 

此例子用了反射,从结果可以看出代理对象截获了对Vector对象的所有调用,在调用传递给Vector之前和之后,代理对象具有采取合适操作的灵活性,虽然这里代理对象所采取的操作就是打印,也可以定义其他操作。

  • 大小: 14.9 KB
分享到:
评论
3 楼 antonyup_2006 2008-12-04  
实现代理的时候可以用接口,也可以不用,因为除了jdk里的代理,还可以用cglib来实现的,因为有些时候并没有实现接口。
2 楼 jbeduhai 2008-12-04  
好象是要用接口的,我的代码也是这样写的,用接口实现代理
1 楼 hanjs 2008-12-03  
不知道你的动态可以执行么?

必须得用接口吧,用抽象类好像不行

相关推荐

    代理设计模式资源

    了解代理模式和协议的正确使用方式对于提高代码的可读性和可维护性至关重要。通过本课程,开发者将深入理解代理模式的工作原理,以及如何利用NSProxy实现更高级的代理功能。同时,学习如何清晰地定义和实现协议,...

    第十二讲:代理模式

    分析这些文件可以帮助我们更直观地了解代理模式的实践应用。 总的来说,代理模式是软件设计中的一个重要工具,它提供了在不改变原有系统结构的前提下,增强或扩展对象功能的能力。理解并熟练运用代理模式,对于提升...

    JAVA设计模式(代理模式)

    了解并熟练掌握代理模式,对于提高Java开发中的设计质量与可维护性具有重要意义。在实践中,应根据具体需求选择合适的代理实现方式,以达到最佳的设计效果。通过学习和实践,开发者可以更好地理解和运用这一模式,...

    android使用signalr代理模式和非代理模式

    SignalR提供了两种主要的工作模式:代理模式和非代理模式。这两种模式在实现上有所不同,各自具有优缺点,适用于不同的场景。 **1. 代理模式(Proxy Mode)** 在代理模式下,SignalR为每个Hub(服务端的业务逻辑...

    android设计模式之代理模式

    代理模式在软件设计中是一种常用的设计模式,尤其在Android开发中,它可以帮助我们实现复杂的控制逻辑,隔离复杂性,以及提供额外的功能。在Android上下文中,代理模式常常用于数据加载、权限控制、事件处理等方面。...

    设计模式(抽象模式·工厂模式·代理模式·单列模式·)

    本资料包包含的是四种重要的设计模式:抽象模式、工厂模式、代理模式和单例模式。 1. 抽象模式: 抽象模式是通过定义抽象类或接口来封装一系列具有相似行为的对象。在面向对象编程中,抽象类通常不被实例化,而是...

    代理模式实例

    代理模式是一种设计模式,它是结构型模式的一种,主要用于在对象之间提供一个代理以控制对原对象的访问。在这个实例中,我们看到的是如何通过代理模式来实现某种功能的增强或控制。下面将详细讲解代理模式的基本概念...

    简单工厂模式、代理模式、策略模式如此相似

    在软件设计模式的世界里,"简单工厂模式"、"代理模式"和"策略模式"都是经典的设计模式,它们各自有着独特的应用场景和优缺点。本文将深入解析这三种模式的原理和区别,帮助读者理解它们在实际开发中的运用。 首先,...

    设计模式及ThreadLocal资料

    接下来,我们要了解代理模式。代理模式为其他对象提供一种代理以控制对这个对象的访问。在Java中,代理模式常用于动态代理,允许在运行时为对象绑定额外的行为,如AOP(面向切面编程)中的事务管理。 然后,我们...

    java代理模式

    代理模式是一种设计模式,它是软件开发中的一种结构型模式,主要用来在客户端和目标对象之间创建一个代理对象,代理对象负责控制对目标对象的访问。代理模式的核心思想是为一个对象提供一个代理,并由代理对象控制对...

    简单工厂,代理模式,单例模式demo

    在软件设计模式中,"简单工厂"、"代理模式"和"单例模式"是非常重要的概念,它们在实际开发中有着广泛的应用。下面将详细解释这三个设计模式,并结合实际示例进行阐述。 **简单工厂模式**是一种创建型设计模式,它...

    动态代理设计模式 日志和源码

    你可以查看定义的接口、代理类、InvocationHandler的实现,以及Spring配置文件,了解它们是如何协作完成动态代理的。 总之,动态代理设计模式是软件开发中一种强大的工具,它让我们能够在不改变原有代码的情况下...

    ios中的代理设置模式

    让我们深入了解一下如何在iOS中实现代理模式: 1. **定义协议**:首先,我们需要创建一个代理协议(Protocol)。这通常是以`.h`文件的形式,使用`@protocol`关键字声明。协议中定义了代理需要实现的方法,这些方法...

    设计模式之_代理模式

    **代理模式**是一种常用的设计模式,它在软件开发中扮演着重要的角色,特别是在对象的访问控制、性能优化、安全策略等方面。代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象可以控制对原...

    设计模式的代理模式的例子

    代理模式是设计模式中的一种结构型模式,它在对象交互中起到了中介的作用,允许通过代理对象来间接调用目标对象,从而提供了额外的功能或者控制访问...了解并熟练掌握代理模式能帮助我们编写出更加灵活和可维护的代码。

    CAS代理模式

    **CAS代理模式详解** CAS(Central Authentication ...了解并熟练掌握CAS代理模式的原理和实现,对于提升系统的安全性、便捷性有着重要的意义。通过深入源码分析和工具使用,我们可以更好地理解和应用这一模式。

    spring proxy代理模仿

    首先,让我们了解代理模式的基本概念。代理模式是一种设计模式,它为一个对象提供一个代理以控制对该对象的访问。在Spring AOP中,有两种类型的代理:JDK动态代理和CGLIB代理。 1. JDK动态代理:当目标对象实现了...

Global site tag (gtag.js) - Google Analytics