结构型模式之代理模式proxy

代理模式proxy

通过代理,控制对对象的访问。可以详细控制控制某个对象的方法,在这个方法前做前置处理,方法后做后置处理

场景

  • 安全代理:屏蔽对真实角色的直接访问。
  • 远程代理:通过代理类处理远程方法调用
  • 延迟加载:先加载轻量级的代理对象,真正需要在加载真正对象

核心角色

  • 真实角色,真正的业务逻辑
  • 代理角色,将统一的流程放到代理角色中
  • 抽象角色(定义真实角色和代理角色的公共对外方法)

静态代理实现

真实角色和代理角色实现相同的一个抽象角色接口

/**
 * 真实对象
 * @author Administrator
 *
 */
public class Real implements SellingHouses {

	@Override
	public void publish() {
		// TODO 自动生成的方法存根
		//不需要真实对象处理
		System.out.println("不需要真实对象处理");
	}

	@Override
	public void lookHouses() {
		// TODO 自动生成的方法存根
		System.out.println("不需要真实对象处理");
	}

	@Override
	public void signContract() {
		// TODO 自动生成的方法存根
		System.out.println("不需要真实对象处理");
	}

	@Override
	public void receiveMoney() {
		// TODO 自动生成的方法存根
		System.out.println("真实对象收钱");
	}

	@Override
	public void giveKey() {
		// TODO 自动生成的方法存根
		System.out.println("不需要真实对象处理");
	}

}

/**
 * 代理对象
 * @author Administrator
 *
 */
public class Proxy implements SellingHouses {
	private Real real;
	
	/**
	 * 
	 */
	public Proxy() {
		real=new Real();
	}
    public Proxy(Real real) {
		super();
		this.real = real;
	}

	@Override
	public void publish() {
		// TODO 自动生成的方法存根
		System.out.println("中介发布");
	}
    

	@Override
	public void lookHouses() {
		// TODO 自动生成的方法存根
		System.out.println("中介带领买家看房");
		
	}

	@Override
	public void signContract() {
		// TODO 自动生成的方法存根
		System.out.println("中介与买家签合同");
		
	}

	@Override
	public void receiveMoney() {
		// TODO 自动生成的方法存根
		real.receiveMoney();
	}

	@Override
	public void giveKey() {
		// TODO 自动生成的方法存根
		System.out.println("中介把钥匙给买家");
	}

}

/**
 * 抽象对象中介代理卖房
 * @author Administrator
 *
 */
public interface SellingHouses {
	/**
	 * 发布
	 */
	void publish();
	/**
	 * 买家看房
	 */
	void lookHouses();
	/**
	 * 签合同
	 */
	void signContract();
	/**
	 * 收钱
	 */
	void receiveMoney();
	/**
	 * 给钥匙
	 */
	void giveKey();
}

public class Client {

	public static void main(String[] args) {
		
		Proxy proxy=new Proxy();
		
		proxy.publish();
		proxy.lookHouses();
		proxy.signContract();
		proxy.receiveMoney();
		proxy.giveKey();
		
	}
}

在这里插入图片描述

动态代理(动态生成代理类)

  • JDK自带的动态代理
  • Javassist字节码操作库
  • CGLIB

JDK自带的动态代理实现:
Java.lang.reflect.Proxy动态生成代理类和对象
Java.lang.reflect.InvocationHandler(处理器接口)通过invoke方法实现对真实对象的访问
每次通过Proxy生成代理对象时,都要指定对应的处理器(handler)对象

/**
 * 抽象对象中介代理卖房
 * @author Administrator
 *
 */
public interface SellingHouses {
	/**
	 * 发布
	 */
	void publish();
	/**
	 * 买家看房
	 */
	void lookHouses();
	/**
	 * 签合同
	 */
	void signContract();
	/**
	 * 收钱
	 */
	void receiveMoney();
	/**
	 * 给钥匙
	 */
	void giveKey();
}


/**
 * 真实对象
 * @author Administrator
 *
 */
public class Real implements SellingHouses {

	@Override
	public void publish() {
		// TODO 自动生成的方法存根
		//不需要真实对象处理
		System.out.println("不需要真实对象处理");
	}

	@Override
	public void lookHouses() {
		// TODO 自动生成的方法存根
		System.out.println("不需要真实对象处理");
	}

	@Override
	public void signContract() {
		// TODO 自动生成的方法存根
		System.out.println("不需要真实对象处理");
	}

	@Override
	public void receiveMoney() {
		// TODO 自动生成的方法存根
		System.out.println("真实对象收钱");
	}

	@Override
	public void giveKey() {
		// TODO 自动生成的方法存根
		System.out.println("不需要真实对象处理");
	}

}


public class ProxyHandler implements InvocationHandler {
	Real real;
	

	public ProxyHandler(Real real) {
		super();
		this.real = real;
	}


	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		// TODO 自动生成的方法存根
		Object obj=null;
		System.out.println("中介发布");
		System.out.println("中介带领买家看房");
		System.out.println("中介与买家签合同");
		if(method.getName().equals("receiveMoney")) {
			obj = method.invoke(real, args);
			
		}
		System.out.println("中介把钥匙给买家");
		
		return obj;
	}

}

public class Client {
	public static void main(String[] args) {
		ProxyHandler handler=new ProxyHandler(new Real());
		
		SellingHouses proxy=(SellingHouses)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] {SellingHouses.class}, handler);//动态生成代理类
		
		proxy.receiveMoney();
		
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值