翡翠原石網(wǎng)站首頁怎么做怎樣做app推廣
一.核心作用
- 通過代理,控制對(duì)對(duì)象的訪問;
- 可以詳細(xì)控制訪問某個(gè)對(duì)象的方法,在調(diào)用這個(gè)方法前做前置處理,調(diào)用這個(gè)方法后做后置處理。
二.核心角色
- 抽象角色: 定義代理角色和真實(shí)角色的公共對(duì)外方法;
- 真實(shí)角色: 實(shí)現(xiàn)抽象角色,定義真實(shí)角色suo’yao實(shí)現(xiàn)的業(yè)務(wù)邏輯,供代理角色調(diào)用;
- 代理角色: 實(shí)現(xiàn)抽象角色,是真實(shí)角色的代理,通過真實(shí)角色的業(yè)務(wù)邏輯方法來實(shí)現(xiàn)抽象方法,并可以附加自己的操作。將統(tǒng)一的流程控制放到代理角色中處理。
三.應(yīng)用場(chǎng)景
- 安全代理: 屏蔽對(duì)真實(shí)角色的直接訪問;
- 遠(yuǎn)程訪問: 通過代理類處理遠(yuǎn)程方法調(diào)用;
- 延遲加載: 先加載輕量級(jí)的代理對(duì)象,真實(shí)需要再加載真實(shí)對(duì)象。
四.分類
- 靜態(tài)代理: 靜態(tài)定義代理類
- 動(dòng)態(tài)代理: 動(dòng)態(tài)生成代理類
五.動(dòng)態(tài)代理類生成方式
- JDK自帶的動(dòng)態(tài)代理;
- CGLIB實(shí)現(xiàn);
- javaassist字節(jié)碼操作庫實(shí)現(xiàn);
- ASM(底層使用指令,可維護(hù)性較差)
六.動(dòng)態(tài)代理相比靜態(tài)代理的優(yōu)點(diǎn)
- 抽象角色中聲明的所有方法都被轉(zhuǎn)移到調(diào)用處理器一個(gè)集中的方法中處理,這樣,我們可以更新靈活和統(tǒng)一的處理眾多的方法。
七.JDK自帶的動(dòng)態(tài)代理
- java.lang.reflect.Proxy
-
- 動(dòng)態(tài)生成代理類和對(duì)象;
- java.lang.reflect.InvocationHandler
-
- 可以通過invoke方法實(shí)現(xiàn)對(duì)真實(shí)角色的代理訪問;
-
- 每次通過Proxy生成代理類對(duì)象時(shí)都有指定對(duì)應(yīng)的處理器對(duì)象
八.舉例代碼實(shí)現(xiàn)
-
例:
- 以金南鈴演出為例,假如客戶邀請(qǐng)金南玲演出唱歌,要做這些事情:面試、簽合同、訂票、唱歌、收錢。如果金南玲演出少,那么這些事情她自己就可以干;如果演出多,與每個(gè)客戶合作她自己都有干這么多事,很繁瑣;金南玲她自己主要業(yè)務(wù)就是唱歌,那么唱歌之前和之后的事都可以交給別人來做,很自然的就產(chǎn)生了經(jīng)紀(jì)人概念。除了唱歌由金南玲本人來做,其它事情都交給經(jīng)紀(jì)人做。這理的經(jīng)紀(jì)人就是我們所說的代理。
-
1.代碼實(shí)現(xiàn)
-
- 抽象角色類
/*** 抽象角色*/
public interface Star {//面試void confer();//簽合同void singContract();//訂票void bookTicket();//唱歌void sing();//收尾款void collectMoney();
}
-
- 真實(shí)角色類
/*** 真實(shí)角色*/
public class RealStar implements Star {@Overridepublic void confer() {System.out.println("面試");}@Overridepublic void singContract() {System.out.println("簽合同");}@Overridepublic void bookTicket() {System.out.println("訂票");}@Overridepublic void sing() {System.out.println("金南鈴本人演唱《逆流成河》");}@Overridepublic void collectMoney() {System.out.println("收錢");}
}
-
- 靜態(tài)代理——代理角色
/*** 代理角色*/
public class ProxyStar implements Star{private RealStar realstar;public ProxyStar(RealStar realstar) {this.realstar=realstar;}@Overridepublic void confer() {System.out.println("面試");}@Overridepublic void singContract() {System.out.println("簽合同");}@Overridepublic void bookTicket() {System.out.println("訂票");}@Overridepublic void sing() {realstar.sing();}@Overridepublic void collectMoney() {System.out.println("收錢");}
}
-
- 靜態(tài)代理——客戶調(diào)用
/*** 靜態(tài)代理*/
public static void main(String[] args) {RealStar realstar=new RealStar();ProxyStar proxystar=new ProxyStar(realstar);proxystar.confer();proxystar.singContract();proxystar.bookTicket();proxystar.sing();proxystar.collectMoney();
}
-
- 動(dòng)態(tài)代理——代理角色
/*** 動(dòng)態(tài)代理實(shí)現(xiàn)代理模式* 動(dòng)態(tài)代理類 */
public class HandlerStar implements InvocationHandler,Star{private Star star;public HandlerStar(Star star) {this.star = star;}@Overridepublic Object invoke(Object proxy, Method method, Object[] o) throws Throwable {confer();singContract();bookTicket();Object invoke = method.invoke(star, o);collectMoney();return invoke;}@Overridepublic void confer() {System.out.println("代理面試");}@Overridepublic void singContract() {System.out.println("代理簽合同");}@Overridepublic void bookTicket() {System.out.println("代理訂票");}@Overridepublic void sing() {}@Overridepublic void collectMoney() {System.out.println("代理收錢");}
}
-
- 動(dòng)態(tài)代理——客戶調(diào)用
/*** 動(dòng)態(tài)代理實(shí)現(xiàn)代理模式*/
public static void main(String[] args) {Star star=new RealStar();HandlerStar handler=new HandlerStar(star);Star proxy=(Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class} , handler);proxy.sing();
}
更多設(shè)計(jì)模式學(xué)習(xí):
??????????設(shè)計(jì)模式(1):介紹
??????????設(shè)計(jì)模式(2):單例模式
??????????設(shè)計(jì)模式(3):工廠模式
??????????設(shè)計(jì)模式(4):建造者模式
??????????設(shè)計(jì)模式(5):原型模式
??????????設(shè)計(jì)模式(6):橋接模式
??????????設(shè)計(jì)模式(7):裝飾器模式
??????????設(shè)計(jì)模式(8):組合模式
??????????設(shè)計(jì)模式(9):外觀模式
??????????設(shè)計(jì)模式(10):享元模式
??????????設(shè)計(jì)模式(11):適配器模式
??????????設(shè)計(jì)模式持續(xù)更新中…