java Proxy代理模式简单讲解

最近研究java设计模式,当研究到proxy模式的时候恍然大悟,感觉这种模式设计的好精妙,下面我写一下个人对此模式的理解,使用例子是最容易理解的上代码.

首先person接口

package com.it.proxy;

/**
 * person接口
 * @author Gaoxu
 *2015-1-28
 */
public interface person {

	void save(String name);
	
	void delete(String name);
	 
}
数据库操作实现person

package com.it.proxy;

/**
 * 实现person接口
 * 数据库操作类
 * @author Gaoxu
 *2015-1-28
 */
public class DBperson implements person{

	@Override
	public void save(String name) {
		//业务逻辑 ,数据库操作
		//真正与数据库进行交互
		System.out.println("保存了:" +name);
		
	}

	@Override
	public void delete(String name) {
		//业务逻辑 ,数据库操作
		System.out.println("删除了:"+ name);
		
		
	}

}
接下来是person的代理类,此类同样实现person接口,但是不做数据库操作,而是进行拦截,代理说白了就是一个中介,你不能直接操作person类,但是又必须有操作,就可以通过代理类进行操作,代理类再进行真正的交互。

<pre name="code" class="java">package com.it.proxy;
/**
 * person代理类
 * @author Gaoxu
 *2015-1-28
 */
public class personProxy implements person{

	private person p;
	private String permissions;
	public personProxy(person p,String permissions) {
		super();
		this.p = p;
		this.permissions=permissions;
	}

	@Override
	public void save(String name) {
		
		//业务逻辑控制,代理类进行拦截
		if("admin".equals(permissions)){
			
			p.save(name);
		}else{
			
			System.out.println("无此权限保存:"+name);
		}
		
	}

	@Override
	public void delete(String name) {
		//业务逻辑控制,代理类进行拦截
				if("admin".equals(permissions)){
					
					p.delete(name);
				}
				else{
					
					System.out.println("无此权限删除:"+name);
				}
	}

	public String getPermissions() {
		return permissions;
	}

	public void setPermissions(String permissions) {
		this.permissions = permissions;
	}

}


 

 测试类 

	<pre name="code" class="java">package com.it.proxy;

public class proxyTest {
	
	public static void main(String[] args) {
		
		personProxy personProxy = new personProxy(new DBperson(), "admin");
		personProxy.save("小马");
		personProxy.delete("小马");
		personProxy.setPermissions("noadmin");
		personProxy.save("小马");
		personProxy.delete("小马");
	}

}

 结果: 

保存了:小马
删除了:小马
无此权限保存:小马
无此权限删除:小马




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代理模式是一种结构型设计模式,它允许通过创建一个代理对象来控制对另一个对象的访问。代理对象充当客户端和目标对象之间的中介,可以在访问目标对象之前或之后执行一些额外的操作。 在Java中,代理模式可以通过使用Java自带的反射包中的类和接口来实现动态代理的功能。主要涉及到三个类:InvocationHandler、Method和Proxy。通过这三个类,可以实现一个动态代理。需要注意的是,JDK动态代理要求被代理的对象必须实现一个接口。 以下是一个简单的示例,演示了如何使用JDK动态代理实现代理模式: ```java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; // 定义接口 interface Subject { void doSomething(); } // 实现接口的具体类 class RealSubject implements Subject { public void doSomething() { System.out.println("RealSubject doSomething"); } } // 实现InvocationHandler接口 class MyInvocationHandler implements InvocationHandler { private Object target; public MyInvocationHandler(Object target) { this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before doSomething"); Object result = method.invoke(target, args); System.out.println("After doSomething"); return result; } } public class ProxyDemo { public static void main(String[] args) { // 创建目标对象 Subject realSubject = new RealSubject(); // 创建InvocationHandler对象 InvocationHandler handler = new MyInvocationHandler(realSubject); // 创建代理对象 Subject proxySubject = (Subject) Proxy.newProxyInstance( realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), handler ); // 调用代理对象的方法 proxySubject.doSomething(); } } ``` 运行上述代码,输出结果为: ``` Before doSomething RealSubject doSomething After doSomething ``` 这个示例中,通过创建一个实现InvocationHandler接口的类MyInvocationHandler,来实现对目标对象RealSubject的代理。在代理对象的方法调用前后,可以执行一些额外的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值