`
come_for_dream
  • 浏览: 119966 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

设计模式之静态代理与动态代理

 
阅读更多

静态代理与动态代理

       代理模式是java开发中用到的相对比较多的设计模式,其中的思想就是主业务和相关业务分离。所谓的代理设计就是指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其他相关业务的处理。比如我们在进行删除操作的时候需要检验一下用户是否登陆,我们可以删除看成主业务,而把检验用户是否登陆看成其相关业务,那么这个活动就可以用代理模式来进行处理

       首先我们来看一下静态代理,在使用静态代理时,代理对象和被代理对象实现统一接口,随意在应用代理时首先要编写一个接口:

 public interface IHello {
	public void sayHello1() ;
	public void sayHello2() ;
	public void sayHello3() ;
	public void sayHello4() ;
   }
 

 

然后编写代理对象,该类和被代理对象一样实现接口IHello.java,只不过在代理对象中增加需要的服务,
   代理类ProxyHello.java代码如下:

   package com.spring.test;
/**
*这里使用构造方法来传递实现接口IHello的任意类,而在IHello的几个业务方法中调用的是传递进去的类方法
*,在各个方法中增加相应的服务,这就是前面说的代理。
*/
public class ProxyHello implements IHello {

	private IHello hello;

	public ProxyHello(IHello hello) {
		this.hello = hello;
	}

	public void validateUser() {

		System.out.println("验证用户");

	}

	public void sayHello1() {
		validateUser();
		hello.sayHello1();
	}

	public void sayHello2() {
		validateUser();
		hello.sayHello2();
	}

	public void sayHello3() {
		validateUser();
		hello.sayHello3();
	}

	public void sayHello4() {
		validateUser();
		hello.sayHello4();
	}
}

 
然后就是编写被代理类,该类实现IHello接口,代码如下:

package com.spring.test;

public class Hello implements IHello{
	public void sayHello1() {
		System.out.println("111111111111");
	}

	public void sayHello2() {
		System.out.println("222222222222");
	}

	public void sayHello3() {
		System.out.println("333333333333");
	}

	public void sayHello4() {
		System.out.println("444444444444");
	}
}

 然后就是测试了:

@Test
	public  void testHello() {
		IHello hello = new ProxyHello(new Hello());
		hello.sayHello1();
		hello.sayHello2();
		hello.sayHello3();
		hello.sayHello4();
	}

 执行结果:

验证用户
111111111111
验证用户
222222222222
验证用户
333333333333
验证用户
444444444444

       从上面看来,静态代理其设计方法上就是被代理类Hello只关注与其主业务的具体实现而不用关心其他的业务,将Hello的对象注入到代理类中,然后在进行方法的包装,用这种方式来解耦合,不过很显然在静态代理中我么可以看到,我们要为接口中的每个方式实现一个验证方法,代码量很大,更重要的是加入接口中增加一个方法或者减少一个方法都需要去修改代理类中的代码,很不方便。那么我们就想到了动态代理。

     动态代理:
   动态代理是根据静态代理机制,抽象出一个泛型代理。他不依赖任何被代理对象的代理实现,该动态代理类需要实现InvocationHandler接口

   

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 
 * <pre>
 * 项目名称:SpringTest  
 * 类名称:DynamicProxy  
 * 类描述:  
 * 创建人:ZDX  
 * 创建时间:2014年11月22日 上午12:09:44  
 * 修改人:ZDX  
 * 修改时间:2014年11月22日 上午12:09:44  
 * 修改备注:  
 * @version
 * </pre>
 */
public class DynamicProxy implements InvocationHandler {

	private Object object;

	/**
	 * 
	 * <pre>
	 * 方法名称:bind 
	 * 方法描述:  该类的bind()方法中使用Proxy的静态方法
	 * newProxyInstance建立一个代理对象,该方法中有3个参数,
	 * 第一个参数是指定代理类的类加载器,
	 * 第二个参数指定被代理类的实现接口,
	 * 第三个参数指定方法调用的处理程序,这里即本程序
	 * 
	 * @version
	 * </pre>
	 */
	public Object bind(Object object) {
		this.object = object;
		return Proxy.newProxyInstance(object.getClass().getClassLoader(),
				object.getClass().getInterfaces(), this);
	}

	/**
	 * <pre>
	 * 调用invoke方法会传入被代理对象的方法与参数,
	 * 也就是说,通过method.invoke(object, args)调用代理类对象中
	 * 的方法,返回结果也就是代理对象中方法的返回结果。
	 * 
	 * </pre>
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {

		Object result = null;
		try {
			validateUser();
			result = method.invoke(object, args);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	public void validateUser() {
		System.out.println("验证用户");
	}
}
 
     IHello和Hello不变,下面是测试方法:
   
@Test
    public  void testHello() {
        
        DynamicProxy dynamicProxy=new DynamicProxy();
        IHello hello=(IHello) dynamicProxy.bind(new Hello());
        hello.sayHello1();
        hello.sayHello2();
        hello.sayHello3();
        hello.sayHello4();
        
    }
 

 

 通过这两种代理可以看出,原本需要在每个程序中出现的代码片段被提取出来,并将片段用在了任意的程序中而丝毫未修改源程序,这就是AOP思想。被提取出来的片段就是横切关注面,片段中的验证用户的方法被称为横向关注点。在AOP编程中,Aspect通过设定一定的规则在程序中需要的时候介入应用程序,为它们提供服务,在不需要的时候,由于其独立性又可以非常方便的脱离出来。

 

 

 

分享到:
评论

相关推荐

    Java设计模式——代理设计模式(静态代理和动态代理)

    代理设计模式分为静态代理和动态代理两种类型。 ### 静态代理 静态代理是在编译时就已经确定了代理关系,代理类和真实类的关系是硬编码在代理类中的。下面我们将详细介绍静态代理的实现方式: 1. **定义接口**:...

    java静态代理、动态代理、装饰设计模式

    Java提供了两种实现代理的主要方式:静态代理和动态代理。 **静态代理** 静态代理是最基础的形式,它需要程序员手动创建一个代理类,该类实现了与目标类相同的接口。代理类持有目标类的引用,并在调用目标类方法...

    代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)与SpringAOP的3种配置方式案例工程代码

    本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种配置方式。以下是详细的知识点解析: ### 静态代理 静态代理是程序员手动创建代理类并实现相同接口的方式。代理类和...

    优秀的设计模式示例-静态代理模式

    静态代理模式是设计模式中的一种,属于结构型模式,主要用在我们想要在不修改原有对象的基础上,为对象添加额外功能或者控制对象的行为时。在这个例子中,"优秀的设计模式示例-静态代理模式"提供了实际项目中的代码...

    Java静态代理和动态代理

    Java中的代理模式是一种设计模式,它允许我们创建一个代理类,该类代表并增强另一个对象(委托类)的功能,而不改变原始对象的行为。代理模式在软件开发中常用于控制访问、增加额外功能或提供安全机制。 一、代理...

    设计模式(八)之静态代理模式.zip

    静态代理模式是设计模式中的一种,它属于结构型模式,主要用来在不修改原有对象的基础上,通过一个代理对象来增强或扩展原对象的功能。在本篇文章中,我们将深入探讨静态代理模式的概念、工作原理以及其优缺点。 ##...

    静态代理与动态代理Demo

    在编程领域,代理模式是一种常用的设计模式,它允许我们在不修改原有对象的基础上,通过一个中介对象来增强或扩展原对象的功能。代理模式分为静态代理和动态代理两种主要形式,每种都有其特定的应用场景和优势。下面...

    java 设计模式之代理模式(Proxy Pattern)实现代码及设计详解:动态代理模式、静态代理模式

    Java设计模式是软件开发中的重要概念,它提供了一套通用的解决方案模板,使得代码更加可复用、可扩展。在这些模式中,代理模式(Proxy Pattern)是...对于Java开发者来说,掌握设计模式是提升专业技能的关键步骤之一。

    JAVA静态代理和动态代理

    在Java编程语言中,代理模式是一种设计模式,它允许我们为一个对象提供一个代理以控制对这个对象的访问。代理模式通常用于增加额外的功能或在访问原对象时进行额外的操作,比如日志记录、安全控制、性能度量等。Java...

    Java静态代理与动态代理demo

    在Java编程中,代理模式是一种常用的结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理模式通常用于增加额外的功能或在访问原始对象时进行额外的操作,比如日志记录、性能监控等。Java提供了两...

    包含静态代理和动态代理demo代码

    与静态代理相比,动态代理更灵活,它在运行时动态地创建代理类。Java中的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。动态代理的步骤如下: 1. 定义一个接口...

    静态代理和动态代理

    在Java编程中,代理模式是一种常见的设计模式,它允许我们为一个对象提供一个代理以控制对这个对象的访问。代理模式通常用于增加额外的功能,如日志、事务管理或者权限控制,而不会改变原始对象的接口。根据实现方式...

    静态代理和动态代理Demo

    总结来说,这个资源提供了一个理解和实践静态代理与动态代理的好例子。通过学习和运行这些代码,你可以深入理解这两种代理模式的工作原理,以及如何在实际项目中应用它们。同时,这也有助于提升你对Java反射机制的...

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    静态代理与动态代理的区别 代理模式可以进一步细分为静态代理和动态代理。 - **静态代理**:在程序编译时就已经确定代理类的具体实现方式。这意味着每次需要代理不同的操作时,都需要修改代理类的代码,这违反了...

    Spring的静态代理和动态代理

    总结来说,Spring的静态代理和动态代理都用于实现AOP,静态代理适用于简单场景,但需要手动编写代理类,而动态代理则更加灵活,可以在运行时动态创建代理对象,适用于接口众多的情况。了解和掌握这两种代理模式对于...

    Java 静态代理模式

    静态代理模式是一种结构型设计模式,其核心思想是通过创建一个代理类,这个代理类作为原对象的替代,提供与原对象相同的方法调用,但可以在调用前后添加额外的操作。这种模式在不修改原始对象代码的情况下,可以用于...

    静态代理和动态代理的讲解和案例,有详细的注释

    总结来说,静态代理在编译时就需要明确代理类与目标类的关系,而动态代理则在运行时动态创建代理类,更灵活但需要实现`InvocationHandler`接口。两者都可以用于在调用目标方法前后插入额外的逻辑,根据具体需求选择...

    java设计模式【之】静态代理【源码】【场景:帮爸爸买菜】.rar

    java设计模式【之】静态代理【源码】【场景:帮爸爸买菜】.rar * 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法调用 * ...

    代理模式_静态代理.zip

    设计模式之代理模式_静态代理的一个java实现的demo。主类在Client中。仅代码实现,可供初学者参考使用

Global site tag (gtag.js) - Google Analytics