輕松掌握J(rèn)ava代理模式
定義:為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標(biāo)對象之間起到中介的作用。
特點:
1、真實的角色就是實現(xiàn)實際的業(yè)務(wù)邏輯,不用關(guān)心其他非本職責(zé)的事務(wù),通過后期的代理完成一件完成事務(wù),附帶的結(jié)果就是編程簡潔清晰。
2、代理對象可以在客戶端和目標(biāo)對象之間起到中介的作用,這樣起到了中介的作用和保護(hù)了目標(biāo)對象的作用。
3、擴(kuò)展性高
企業(yè)級開發(fā)和常用框架中的應(yīng)用:最著名的就是spring的aop,還有spring的bean的創(chuàng)建其實也用到了代理
代理模式分為了動態(tài)代理和靜態(tài)代理,動態(tài)代理是開發(fā)中應(yīng)用的特別多。
靜態(tài)代理:
/**
* 以買房舉例
*/
interface Actions {
/**
* 選房
*/
public void selectHouse();
/**
* 看房
*/
public void seeHouse();
/**
* 入住
*/
public void ruzhu();
}
class RealRole implements Actions{
public void selectHouse() {
System.out.println("用戶自己選房");
}
public void seeHouse() {
System.out.println("用戶自己看房");
}
public void ruzhu() {
System.out.println("用戶自己入住");
}
}
class ProxyRole implements Actions{
private RealRole realRole;
public ProxyRole(RealRole realRole) {
this.realRole = realRole;
}
public void selectHouse() {
System.out.println("中介選房");
}
public void seeHouse() {
System.out.println("中介看房");
}
@Override
public void ruzhu() {
realRole.ruzhu();
}
}
public class Demo {
public static void main(String[] args) {
RealRole realRole = new RealRole();
ProxyRole proxyRole = new ProxyRole(realRole);
proxyRole.selectHouse();
proxyRole.seeHouse();
proxyRole.ruzhu();
}
}
動態(tài)代理:
/**
* 以買房舉例
*/
interface Actions {
/**
* 選房
*/
public void selectHouse();
/**
* 看房
*/
public void seeHouse();
/**
* 入住
*/
public void ruzhu();
}
class RealRole implements Actions{
public void selectHouse() {
System.out.println("用戶自己選房");
}
public void seeHouse() {
System.out.println("用戶自己看房");
}
public void ruzhu() {
System.out.println("用戶自己入住");
}
}
class Handler implements InvocationHandler{
private RealRole realRole ;
public Handler(RealRole realRole) {
this.realRole = realRole;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(realRole);
System.out.println("中介選房,看房");
method.invoke(realRole, args);
return null;
}
}
public class Demo {
public static void main(String[] args) {
RealRole realRole = new RealRole();
Handler handler = new Handler(realRole);
Actions proxy = (Actions) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Actions.class}, handler);
proxy.ruzhu();
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA下載并大學(xué)生edu郵箱認(rèn)證免費使用教程(圖文)
這篇文章主要介紹了IDEA下載并大學(xué)生edu郵箱認(rèn)證免費使用教程(圖文),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
解決spring boot hibernate 懶加載的問題
這篇文章主要介紹了解決spring boot hibernate 懶加載的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
詳解Java中synchronized關(guān)鍵字的死鎖和內(nèi)存占用問題
Java的synchronized關(guān)鍵字用來進(jìn)行線程同步操作,然而這在使用中經(jīng)常會遇到一些問題,這里我們就來詳解Java中synchronized關(guān)鍵字的死鎖和內(nèi)存占用問題:2016-06-06
Java中HashTable和HashMap的區(qū)別_動力節(jié)點Java學(xué)院整理
HashTable和HashMap主要的區(qū)別有:線程安全性,同步(synchronization),以及速度。接下來通過本文給大家簡單介紹下HashTable和HashMap的區(qū)別,需要的的朋友參考下吧2017-04-04

