JAVA代理模式简单应用

本文介绍了Java代理模式的概念,通过将主要业务与次要业务解耦,使得开发者可以专注于核心业务。以上下班打卡为例,展示了如何使用代理模式实现次要业务(打卡)与主要业务(上班、下班)的结合。真实实现类处理上班、下班,代理实现类(InvocationHandler)处理打卡逻辑,最后通过Proxy类创建代理对象以实现业务的完整流程。
摘要由CSDN通过智能技术生成

1.何为代理模式

如果从业务角度来讨论,就是将主要业务和次要业务解耦合,让开发人员只需要专注主要业务的开发即可,mybatis是代理模式最好的体现,开发人员只需要专注sql开发,jdbc连接都交由代理自动处理

2.代理模式相关对象

  • 接口:声明需要被监听的的行为
  • 真实实现类:实现主要业务行为
  • 代理实现类(InvocationHandler):将次要业务和主要业务绑定执行
  • 代理对象(监听对象)

3.简单应用例子

场景:上下班都需要打卡

主要业务:上班、下班

次要业务:打卡

代码实现

接口类:

public interface SbService {
          public void onWork(String name);//上班
          public void offWork(String name);//下班
}

真实实现类:

public class Person implements SbService {

	@Override
	public void onWork(String name) {
		System.out.println(name+"在XXX公司上班");

	}

	@Override
	public void offWork(String name) {
		System.out.println(name+"在XXX公司下班");

	}

}

代理实现类:

//实现InvocationHandler接口
public class Agent implements InvocationHandler {

	 private SbService obj;// 传入的真实对象
	 
	//完成次要业务和主要业务绑定
	
	public Agent(SbService param) {
		
		this.obj = param;
	}

	/*
	 *  Object proxy:本次负责监听对象
	 *  
	 *  Method method: 被拦截的主要业务方法
	 *  
	 *  Object[] params:被拦截的主要业务方法接受的实参
	 * 
	 * 
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] params) throws Throwable {
		
		           //1.读取被拦截的方法名称
		           String methodName =method.getName();
		           if("onWork".equals(methodName)){//上班打卡
		        	   card();//上班前打卡
		        	   method.invoke(obj, params);
		           }else if("offWork".equals(methodName)){//下班打卡
		        	   method.invoke(obj, params);
		        	   card();//下班后打卡
		           }
		       
		return null;
	}
	
	//次要业务
	private void card(){		
		System.out.println("打卡");//解耦合;
	}

}

代理对象:

public class ProxyFactory {

	public static SbService newInstance(){
		
		    
	}
	public static SbService newInstance(Class classFile) throws InstantiationException, IllegalAccessException{
		
		 //0.创建被索要的类型的实例对象
		     SbService 真实对象 =     (SbService) classFile.newInstance();
		   //1.让真实对象拥有一个代理实现类对象
		   InvocationHandler agent = new Agent(真实对象);
		   
		   //2.申请/注册一个对特定行为进行监控对象(代理对象)
		   /*
		    *  loader:指向被监控的类文件在内存中真实地址
		    *  interfaces: 被监控的类所实现的接口,这个接口中声明的方法,就是需要被监控行为
		    *              也是主要业务行为名称
		    * */
		   Class classArray[]={SbService.class};
		   SbService 监听对象=(SbService) Proxy.newProxyInstance(classFile.getClassLoader(), classArray, agent);
	       return    监听对象;     
	}
}

测试:

public class TestMain {

	public static void main(String[] args) throws InstantiationException, IllegalAccessException {
		SbService sb = ProxyFactory.newInstance(Person.class);
		sb.onWork("小红");
        sb.offWork("小红");
	}

}

结果:

打卡

小红在XXX公司上班

小红在XXX公司下班

打卡

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

意向天开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值