1. 程式人生 > >設計模式之結構型--代理模式

設計模式之結構型--代理模式

類和對象 mic div att 機票 name void out pro

代理模式(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();
	}
}

  

設計模式之結構型--代理模式