來源:http://www.bjsxt.com/
一、S03E236_01【GOF23設計模式】_代理模式、靜態代理
package com.test.proxy.staticProxy;
public interface Star {
/**
* 面談
*/
void confer();
/**
* 籤合同
*/
void signConstract();
/**
* 訂票
*/
void bookTicket();
/**
* 唱歌
*/
void sing();
/**
* 收錢
*/
void collectMoney();
}
package com.test.proxy.staticProxy;
public class RealStar implements Star{
@Override
public void confer() {
System.out.println("RealStar.confer()");
}
@Override
public void signConstract() {
System.out.println("RealStar.signConstract()");
}
@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.test.proxy.staticProxy;
public class ProxyStar implements Star{
private Star realStar;
public ProxyStar(Star realStar) {
super();
this.realStar = realStar;
}
@Override
public void confer() {
System.out.println("ProxyStar.confer()");
}
@Override
public void signConstract() {
System.out.println("ProxyStar.signConstract()");
}
@Override
public void bookTicket() {
System.out.println("ProxyStar.bookTicket()");
}
@Override
public void sing() {
realStar.sing();
}
@Override
public void collectMoney() {
System.out.println("ProxyStar.collectMoney()");
}
}
package com.test.proxy.staticProxy;
public class Client {
public static void main(String[] args) {
Star realStar = new RealStar();
Star proxyStar = new ProxyStar(realStar);
proxyStar.confer();
proxyStar.signConstract();
proxyStar.bookTicket();
proxyStar.sing();
proxyStar.collectMoney();
}
}
控制檯輸出:
ProxyStar.confer()
ProxyStar.signConstract()
ProxyStar.bookTicket()
RealStar(歌手本人).sing()
ProxyStar.collectMoney()
二、S03E237_01【GOF23設計模式】_代理模式、動態代理、開發中常見的場景
動態代理(動態生成代理類)
——JDK自帶的動態代理
——javaassist字節碼操作庫實現
——CGLIB
——ASM(底層使用指令,可維護性較差)
動態代理相比於靜態代理的優點
——抽象角色中(接口)聲明的所有方法都被轉移到調用處理器中一個集中的方法中處理,這樣我們可以更加靈活和統一地處理衆多的方法。
JDK自帶的動態代理
——java.lang.reflect.Proxy
————作用:動態生成代理類和對象
——java.lang.reflect.InvocationHandler(處理器接口)
————可以通過invoke方法實現對真實角色的代理訪問
————每次通過Proxy生成代理類對象時都要指定對應的處理器對象
Star realStar = new RealStar();
StarHandler handler = new StarHandler(realStar);
Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler);
proxy.sing();
package com.test.proxy.dynamicProxy;
public interface Star {
/**
* 面談
*/
void confer();
/**
* 籤合同
*/
void signConstract();
/**
* 訂票
*/
void bookTicket();
/**
* 唱歌
*/
void sing();
/**
* 收錢
*/
void collectMoney();
}
package com.test.proxy.dynamicProxy;
public class RealStar implements Star{
@Override
public void confer() {
System.out.println("RealStar.confer()");
}
@Override
public void signConstract() {
System.out.println("RealStar.signConstract()");
}
@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.test.proxy.dynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class StarHandler implements InvocationHandler{
private Star realStar;
public StarHandler(Star realStar) {
super();
this.realStar = realStar;
}
@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(realStar, args);
}
System.out.println("真正的方法執行後");
System.out.println("收尾款");
return object;
}
}
package com.test.proxy.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.sing();
}
}
控制檯輸出:
真正的方法執行前
面談,籤合同,預付款,訂機票
RealStar(歌手本人).sing()
真正的方法執行後
收尾款