前言
本文主要講述代理模式,文中使用通俗易懂的案例,使你更好的學(xué)習(xí)本章知識(shí)點(diǎn)并理解原理,做到有道無(wú)術(shù)。
一.什么是代理模式
代理模式是23種設(shè)計(jì)模式中結(jié)構(gòu)型模式的一種,它的核心是通過(guò)代理類來(lái)完成其他對(duì)象的訪問(wèn),降低訪問(wèn)者和被訪問(wèn)者的耦合度,也對(duì)功能進(jìn)行了增強(qiáng)。
二.生活中的代理模式
1.經(jīng)紀(jì)人
每個(gè)藝人都擁有自己的經(jīng)紀(jì)人,幫助他處理工作上的事情,例如幫藝人接活、商務(wù)談判、宣傳包裝等等,如果我們想聯(lián)系上哪位藝人,主要就是通過(guò)經(jīng)紀(jì)人來(lái)完成,而經(jīng)紀(jì)人就跟設(shè)計(jì)模式中的代理模式類似。
2.房產(chǎn)中介
現(xiàn)在很多年輕人在大城市工作都是租房住的,大家現(xiàn)在購(gòu)買房子或者租房的話是不是通過(guò)房產(chǎn)中介呢,反正是通過(guò)房產(chǎn)中介找到房子的,而房產(chǎn)中介他是負(fù)責(zé)幫助房主出售或者出租房子的,通過(guò)房產(chǎn)中介我們就無(wú)需每個(gè)房子都需要通過(guò)聯(lián)系房主來(lái)獲取房源信息,大大提高了我們選房效率,而房產(chǎn)中介就跟設(shè)計(jì)模式中的代理模式類似。
3.婚介
現(xiàn)在有很多婚介公司或者各種APP來(lái)幫助大家擴(kuò)展社交范圍,認(rèn)識(shí)更多的人,提升戀愛(ài)率和結(jié)婚率。而婚介公司或者各種交友APP就跟設(shè)計(jì)模式中的代理模式類似。
三.代理模式的實(shí)現(xiàn)
代理模式有兩種,一種是靜態(tài)代理,一種是動(dòng)態(tài)代理
1.靜態(tài)代理
接下來(lái)就以演員和經(jīng)紀(jì)人來(lái)舉例,通過(guò)靜態(tài)代理來(lái)實(shí)現(xiàn)。先創(chuàng)建一個(gè)接口和被代理對(duì)象類演員類以及靜態(tài)代理類經(jīng)紀(jì)人類
package com.qianfeng.ran;
/*
* @author:江帥
* 接口
* 人類接口
*/
public interface Human {
void behavior();
}
/*
* @author:江帥
* 被代理對(duì)象類
* 演員類
*/
class Actor implements Human{
@Override
public void behavior() {
System.out.println("某某明星進(jìn)行拍戲");
}
}
/*
* @author:江帥
* 靜態(tài)代理類
* 經(jīng)紀(jì)人
*/
class Broker implements Human{
private Human human;
//獲取具體的明星對(duì)象
public Broker(Human human){
this.human = human;
}
@Override
public void behavior() {
System.out.println("接商演");
System.out.println("安排行程");
human.behavior();
System.out.println("后續(xù)工作進(jìn)行");
}
}
然后創(chuàng)建一個(gè)客戶端使用代理模式,完成通過(guò)經(jīng)紀(jì)人聯(lián)系演員讓演員拍戲,并增強(qiáng)功能
package com.qianfeng.ran;
/*
* @author:江帥
* 客戶端
*/
public class Demo {
public static void main(String[] args) {
//創(chuàng)建明星對(duì)象
Actor actor = new Actor();
//創(chuàng)建經(jīng)紀(jì)人對(duì)象并傳遞明星對(duì)象
Broker broker = new Broker(actor);
//執(zhí)行結(jié)果:
//接商演
//安排行程
//某某明星進(jìn)行拍戲
//后續(xù)工作進(jìn)行
broker.behavior();
}
}
2.動(dòng)態(tài)代理
接下來(lái)我們以房產(chǎn)中介的來(lái)舉例,使用動(dòng)態(tài)代理來(lái)實(shí)現(xiàn)。先創(chuàng)建代理接口人類接口和被代理對(duì)象類用戶類
package com.qianfeng.ran;
/*
* @author:江帥
* 接口
* 人類接口
*/
public interface Human {
void behavior();
}
/*
* @author:江帥
* 被代理對(duì)象類
* 用戶
*/
public class User implements Human{
@Override
public void behavior() {
System.out.println("租房");
}
}
再創(chuàng)建一個(gè)動(dòng)態(tài)代理類房產(chǎn)中介類
package com.qianfeng.ran;
/*
* @author:江帥
* 動(dòng)態(tài)代理類
* 房產(chǎn)中介
*/
public class DynamicProxy implements InvocationHandler {
//需要被代理的對(duì)象
private Object obj;
public Object newInstance(Object obj){
this.obj = obj;
/**
* 第一個(gè)參數(shù)為被代理對(duì)象的類加載器
* 第二個(gè)參數(shù)為被代理對(duì)象的接口
* 第三個(gè)此參數(shù)為當(dāng)前對(duì)象
*/
return Proxy.newProxyInstance(obj.getClass().getClassLoader()
,obj.getClass().getInterfaces(),
this);
}
/**
* 調(diào)用被代理對(duì)象的方法都會(huì)經(jīng)過(guò)該方法
* @param proxy 代理對(duì)象的引用
* @param method 被調(diào)用的方法對(duì)象
* @param args 被調(diào)用方法的參數(shù)數(shù)組
* @return 原方法的返回值
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
start();
//調(diào)用被代理對(duì)象的方法
Object respBean = method.invoke(obj, args);
commit();
return respBean;
}
public void start(){
System.out.println("帶客戶看房子");
}
public void commit(){
System.out.println("與客戶簽署合同");
}
}
最后動(dòng)態(tài)代理實(shí)現(xiàn)通過(guò)房產(chǎn)中介增強(qiáng)用戶尋找房子的行為
package com.qianfeng.ran;
/*
* @author:江帥
* 客戶端
*/
public class Demo {
public static void main(String[] args) {
//創(chuàng)建房產(chǎn)中介 -- 代理對(duì)象類
DynamicProxy proxy = new DynamicProxy();
//通過(guò)房產(chǎn)中介找房子 -- 調(diào)用代理對(duì)象的方法并傳遞被代理對(duì)象,實(shí)現(xiàn)增強(qiáng)
Human human = (Human) proxy.newInstance(new User());
//執(zhí)行結(jié)果:
//帶客戶看房子
//租房
//與客戶簽署合同
human.behavior();
}
}
五.總結(jié)
代理模式中分為兩種代理:靜態(tài)代理和動(dòng)態(tài)代理
靜態(tài)代理的實(shí)現(xiàn)會(huì)導(dǎo)致代理類的冗余,每增加一個(gè)被代理對(duì)象就需要增加一個(gè)代理類。就像一對(duì)一的明星經(jīng)紀(jì)人,每多一個(gè)明星就需要多一個(gè)經(jīng)紀(jì)人。
動(dòng)態(tài)代理的實(shí)現(xiàn)則減少了代理類的冗余,只需要一個(gè)動(dòng)態(tài)代理類即可,但是會(huì)對(duì)被代理的對(duì)象每個(gè)方法都進(jìn)行增強(qiáng)。就像房產(chǎn)中介,每多個(gè)客戶并不需要再額外多一個(gè)中介來(lái)服務(wù),房產(chǎn)中介可以一個(gè)人對(duì)多個(gè)用戶,但是每個(gè)用戶得到的都是同一個(gè)房產(chǎn)中介的服務(wù)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-491645.html
下一章,將帶大家學(xué)習(xí)電腦與游戲的關(guān)系(設(shè)計(jì)模式之橋接模式)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-491645.html
到了這里,關(guān)于Java設(shè)計(jì)模式之代理模式--經(jīng)紀(jì)人的工作的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!