设计模式之结构型--代理模式

代理模式(Proxy pattern)
核心作用:

通过代理,控制对对象的访问
可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后
做后置处理(即:AOP的微观实现)

----AOP(Aspect Oriented Programming面向切面编程)的核心实现机制

--核心角色:

抽象角色:
  定义代理角色和真实角色的公共对外方法,(一个接口,真实角色和代理角色都要去实现这个接口)
真实角色
  实现抽象角色,定义真实角色所要实现的业务逻辑供代理角色调用
代理角色
  实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现
  抽象方法,并可以附加自己的操作(外部只会去访问代理类,代理再调用真实角色的方法)

将统一的流程控制放到代理角色中处理

静态代理容易实现(省略)
动态代理(JDK自带的实现)
--java.lang.reflect.Proxy
  作用:动态生成代理类和对象
--java.lang.reflect.InvocationHander(处理器接口)
  可以通过invoke方法实现对真实角色的代理访问
  每次通过Proxy生成代理类对象时都要指定对应的处理器对象

 动态代理实例:

package com.luruixiao.pattern.dynamicProxy;

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

  

package com.luruixiao.pattern.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()");
	}

}

  

package com.luruixiao.pattern.dynamicProxy;

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

public class StarHandler implements InvocationHandler{
	
	Star realStar;
	
	public StarHandler(Star realStar) {
		super();
		this.realStar = realStar;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object obj = null;
		System.out.println("真正方法执行前");
		System.out.println("面谈,签合同,预付款,订机票");
		if(method.getName().equals("sing")) {
			obj = method.invoke(realStar, args);
		}
		System.out.println("真正方法执行后");
		System.out.println("收尾款");
		return obj;
	}

}

  

package com.luruixiao.pattern.dynamicProxy;

import java.lang.reflect.Proxy;

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

  

 

posted @ 2018-08-02 15:21  风中雨雨中路  阅读(86)  评论(0编辑  收藏  举报