java代理简介

二、代理

1.1、代理概念

代理(Proxy)是一种设计模式,提供了对目标对象的另外的访问方式。

代理意义:可以再目标对象代码实现的基础上,增强额外的功能代码。

1.2、核心原理图

1.3、Java中三种创建代理对象方式

1.3.0、接口

接口是对行为的抽象,将所有方法都抽象(没有属性只有方法)

类和接口之间关键字是implements实现

1.3.0.1、思路图

1.3.1、静态代理

静态代理比较死板不灵活,一般情况下不适用

目标类接口:

public interface ByClothes {
	public void clothes(String size);
}

目标类:

public class ClothesFactory implements ByClothes{
	@Override
	public void clothes(String size) {
		// TODO Auto-generated method stub
		System.out.println("已经定制了一套"+size+"的cos服");
	}
}

代购类:

public class BuyClothes implements ByClothes{
	//目标对象
	public ClothesFactory clothesFactory;
	//构造方法赋值
	public BuyClothes(ClothesFactory clothesFactory) {
		this.clothesFactory = clothesFactory;
	}
	
	@Override
	public void clothes(String size) {
		// TODO Auto-generated method stub
		frontService();
		System.out.println("已经定制了一套"+size+"的cos服");
		backService();
	}
	public void frontService() {
		System.out.println("售前服务");
	}
	public void backService() {
		System.out.println("售后服务");
	}

}

测试及结果:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		ClothesFactory clothesFactory=new ClothesFactory();
		BuyClothes buyClothes=new BuyClothes(clothesFactory);
		buyClothes.clothes("4xL");
		System.out.println("************");
		clothesFactory.clothes("5xL");
	}
 
 结果:
     售前服务
    已经定制了一套4xL的cos服
    售后服务
    ************
    已经定制了一套5xL的cos服

1.3.2、基于jdk(接口)的动态代理

接口:

public interface ByShoot {
	void byShoot(String size);
}

目标类:

public class ShootFactory implements ByShoot{

	@Override
	public void byShoot(String size) {
		// TODO Auto-generated method stub
		System.out.println("定制了一双"+size+"码的鞋");
	}

}

动态代理类:

public class Company implements InvocationHandler{
	
	private Object object;
	
	/**
	 * @return the object
	 */
	public Object getObject() {
		return object;
	}
	/**
	 * @param object the object to set
	 */
	public void setObject(Object object) {
		this.object = object;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		// TODO Auto-generated method stub
		frontService();
		method.invoke(object, args);
		backService();
		return null;
	}
	public void frontService() {
		System.out.println("售前服务");
	}
	public void backService() {
		System.out.println("售后服务");
	}
	//获取一个代购人员
	public Object getProxyInstance() {
		Object obj=Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
		return obj;
		
	}

测试:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		ClothesFactory clothesFactory=new ClothesFactory();
		ShootFactory shootFactory=new ShootFactory();
		Company company=new Company();
		//代理卖衣服
		company.setObject(clothesFactory);
		ByClothes object=(ByClothes)company.getProxyInstance();
		object.clothes("4xL");
		System.out.println("************");
		//代理卖鞋
		company.setObject(shootFactory);
		ByShoot object1=(ByShoot)company.getProxyInstance();
		object1.byShoot("43");
	}

1.3.3、基于CGLIB的动态代理

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值