设计模式:代理模式(委托模式)

本文详细介绍了Java中的代理模式,包括其基本结构、实现方式及应用场景。通过具体代码示例展示了如何使用代理模式来增强目标对象的功能,例如事务管理、异常处理和日志记录等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

基本结构:

1、抽象主题:接口,定义需要进行代理的方法。

2、实际主题:实现1接口,实际主题实例是代理实例所要代理的对象。

3、代理:实现1接口,代理包含实际主题声明的对象,因为代理将委托实际主题执行相关的方法。在委托的前后将进行一定的干预以控制对实际主题的访问。

(实际主题被代理或称,代理根据需要委托实际主题执行逻辑)

 

1、抽象主题

 

package proxy;
/** 
* @author  Jangle jangle@jangle.xyz: 
* @date 创建时间:2016年10月5日 上午9:17:30 
* @version 1.0 
*/
public interface BaseProxy {
	
	public void theMethod();
	
}


2、实际主题

 

 

package proxy;
/** 
* @author  Jangle jangle@jangle.xyz: 
* @date 创建时间:2016年10月5日 上午9:20:38 
* @version 1.0 
*/
public class Template implements BaseProxy {

	@Override
	public void theMethod() {
		
		System.out.println("I'm do something!!");

	}

}


3、代理

 


代理1

 

package proxy;
/** 
* @author  Jangle jangle@jangle.xyz: 
* @date 创建时间:2016年10月5日 上午9:21:52 
* @version 1.0 
*/
public class Proxy implements BaseProxy {

	private BaseProxy baseProxy;
	/**
	 * @param baseProxy
	 */
	public Proxy(BaseProxy baseProxy) {
		super();
		this.baseProxy = baseProxy;
	}
	
	
	@Override
	public void theMethod() {
		System.out.println("intervene before");
		baseProxy.theMethod();
		System.out.println("intervene after");
		
	}

}

代理2

 

 

package proxy;
/** 
* @author  Jangle jangle@jangle.xyz: 
* @date 创建时间:2016年10月5日 上午9:27:01 
* @version 1.0 
*/
public class Proxy2 implements BaseProxy {
	
	BaseProxy baseProxy;

	/**
	 * @param baseProxy
	 */
	public Proxy2(BaseProxy baseProxy) {
		super();
		this.baseProxy = baseProxy;
	}

	@Override
	public void theMethod() {
		before();
		baseProxy.theMethod();
		after();

	}
	
	private void before(){
		System.out.println("before");
	}
	
	private void after(){
		System.out.println("after");
	}

}

 

 

 

100、程序

 

<pre name="code" class="java">package proxy;
/** 
* @author  Jangle jangle@jangle.xyz: 
* @date 创建时间:2016年10月5日 上午9:24:42 
* @version 1.0 
*/
public class M {

	public static void main(String[] args) {
		BaseProxy template = new Template();
		Proxy proxy = new Proxy(template);		//proxy代理template
//		proxy.theMethod();						
		
		Proxy2 proxy2 = new Proxy2(proxy);		//proxy2代理proxy,即对template进行了2层代理,或者说2级委托
		proxy2.theMethod();

	}

}

 

 

 

 

 


 


结果输出:

 

 

before
intervene before
I'm do something!!
intervene after
after


I'm do something 是主要要执行的逻辑。  代理后,对其进行了一定的干预,使其这执行之前或者之后可以做一些其他的事情。 

 

 

 

这些其他的事情可以是:

1、before事务的开始,after事务的提交。  

2、我们也可以把委托的方法放在try catch块中,对方法进行异常抓取与处理,如:

 

try {
	baseProxy.theMethod();
} catch (xxxException x) {
	// TODO: handle exception
} catch (yyyException y) {
	// TODO: handle exception
} catch (Exception e) {
	// TODO: handle exception
}


3、我们也可以进行日志的输出,如

 

logger.info("xxxxBegin");
baseProxy.theMethod();
logger.info("xxxxEnd");

当然这些在Spring框架中都有所应用,他们更强大,更精致,需要进一步学习。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值