代理模式(Proxy)动态代理

介绍一下jdk自带动态代理。

  java.lang.reflect.Proxy和java.lang.reflect.InvocationHandler 
  使用动态代理,还可以完成对实现了某些接口的类的特定方法进行改造。 

下面用代码来说明: 

1.首先还是创建Star接口和真实明星的对象:  

package com.note.pattern.proxy.dynamicproxy;

public interface Star {
	 /**
     * 面谈
     */
    void confer();
    /**
     * 签合同
     */
    void signContract();
    /**
     * 订票
     */
    void bookTicket();
    /**
     * 唱歌
     */
    void sing();
    /**
     * 收钱
     */
    void collectMoney();
}

  

  

package com.note.pattern.proxy.dynamicproxy;

public class RealStar implements Star{

	@Override
	public void confer() {
		System.out.println("RealStar.confer()");
	}

	@Override
	public void signContract() {
		System.out.println("RealStar.signContract()");
	}

	@Override
	public void bookTicket() {
		System.out.println("RealStar.bookTicket()");
	}

	@Override
	public void sing() {
		System.out.println("RealStar(周杰伦本人).sing()");
	}

	@Override
	public void collectMoney() {
		System.out.println("RealStar.collectMoney()");
	}

}

  

2.创建Handler类,继承InvocationHandler类即可:

package com.note.pattern.proxy.dynamicproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class StarHandler implements InvocationHandler{
	
	private Star mRealStar;
	
	public StarHandler(Star star) {
		mRealStar = star;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object object = null;

		System.out.println("真正的方法执行前!");
		System.out.println("面谈,签合同,预付款,订机票");

		if (method.getName().equals("sing")) {
			object = method.invoke(mRealStar, args);
		}

		System.out.println("真正的方法执行后!");
		System.out.println("收尾款");
		return object;
	}

}

3.代理对象可以在客户端直接创建:

package com.note.pattern.proxy.dynamicproxy;

import java.lang.reflect.Proxy;

public class Client {

	public static void main(String[] args) {
		
		Star realStar = new RealStar();
		StarHandler starHandler = new StarHandler(realStar);
		Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] {Star.class},starHandler);
		proxy.sing();
	}

}

  

posted @ 2018-01-03 16:31  jianhuazhao  阅读(285)  评论(0编辑  收藏  举报