前言:
代理模式可以類比於歌手與經濟人的關係,如果你想讓歌手唱歌,那麼通過經紀人就可以解決訂票、籤合同、唱歌(歌手唱歌)、收尾款等一些活動。
一、理論
代理模式(proxy pattern)
核心角色:
抽象角色:(歌手和經濟人都是人)
定義代理角色和真實角色的公共對外方法
真實角色:(歌手)
實現真實角色,定義真實角色所要實現的業務邏輯供代理角色調用
關注真正的業務邏輯
代理角色:
實現抽象角色,是真實的角色代理,通過真實角色的業務邏輯方法來實現抽象方法,並可以附加自己的操作
將統一的流程控制放到代理角色中處理
二、靜態代理
一、類結構
-
Star(抽象類或者結構--人)
public interface Star { /**訂票*/ void BookTicket(); /**籤合同 * * * */ void signContract(); /* * 唱歌 (歌手能夠唱歌,但是代理人不能唱歌) * * * */ void sing(); /*收尾款 * * * */ void endMoney(); }
-
SingStar(歌手)代碼:
//歌手實現了人接口 public class SingStar implements Star{ @Override public void BookTicket() { // TODO 自動生成的方法存根 System.out.print("訂票了啊啊 "); } @Override public void signContract() { // TODO 自動生成的方法存根 System.out.println("籤合同了 啊啊啊"); } @Override public void sing() { // TODO 自動生成的方法存根 System.out.println("周杰倫唱歌了"); } @Override public void endMoney() { // TODO 自動生成的方法存根 System.out.println("收尾款"); } }
-
ProxyStar(代理人)代碼:
/** * @author zhangyang * */ //經紀人的實現 public class ProxyStar implements Star{ private Star star;//利用了組合關係 public ProxyStar(Star singstar) { this.star = singstar; } @Override public void BookTicket() { // TODO 自動生成的方法存根 System.out.println("代理人訂票!"); } @Override public void signContract() { // TODO 自動生成的方法存根 System.out.println("籤合同!"); } @Override //調用的歌手唱歌的方法 public void sing() { // TODO 自動生成的方法存根 star.sing(); } @Override public void endMoney() { // TODO 自動生成的方法存根 System.out.println("代理人收尾款了"); } }
-
Client(客戶)代碼:
public class Client {
public static void main(String[] args) {
Star singstar=new SingStar();
Star proxystar=new ProxyStar(singstar);
//將他代理
proxystar.BookTicket();
proxystar.signContract();
proxystar.sing();
proxystar.endMoney();
}
}
實現結果:
二、動態代理
動態代理在本質上使用了反射的機制。
實現:
一、類結構
- Star代碼(同上)
//調用相關的抽象角色 public interface Star { void bookTicket(); void sing(); void endMoney(); }
- RealStart(歌手)
public class RealStar implements Star{ @Override public void bookTicket() { // TODO 自動生成的方法存根 System.out.println("歌手訂票!"); } @Override public void sing() { // TODO 自動生成的方法存根 System.out.println("歌手唱歌!"); } @Override public void endMoney() { // TODO 自動生成的方法存根 System.out.println("歌手收尾款!"); } }
- StartHandler(代理操作)
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 { // TODO 自動生成的方法存根 System.out.println("####"); //將自身的RealStar對象變成代理 method.invoke(realstar, args); return null; } }
- Client(客戶)
import java.lang.reflect.Proxy;
import java.util.logging.Handler;
public class Client {
public static void main(String[] args) {
Star star=new RealStar();
StarHandler starHandler=new StarHandler(star);
//返回一個代理類,相當於經紀人
Star star2=(Star)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] {Star.class}, starHandler);
star2.bookTicket();
star2.sing();
star2.endMoney();
}
}
實現結果:
調用的都是RealStar類對象的方法