目錄
代理模式
簡介
優(yōu)缺點(diǎn)
角色職責(zé)
實(shí)現(xiàn)
運(yùn)用場景
外觀模式
簡介
角色職責(zé)
優(yōu)缺點(diǎn)
實(shí)現(xiàn)
使用場景
代理模式
簡介
由于某些原因需要給某對象提供一個(gè)代理以控制對該對象的訪問。這時(shí),訪問對象不適合或者不能直接引用目標(biāo)對象,代理對象作為訪問對象和目標(biāo)對象之間的中介
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
??????? 1.在客戶端與目標(biāo)對象之間起到一個(gè)中介作用和保護(hù)目標(biāo)對象的作用
??????? 2.可以擴(kuò)展目標(biāo)對象的功能
??????? 3.將客戶端與目標(biāo)對象分離,在一定程度上降低了系統(tǒng)的耦合度,增加了程序的可擴(kuò)展性
缺點(diǎn):
??????? 1.會(huì)造成系統(tǒng)設(shè)計(jì)中類的數(shù)量增加
??????? 2.在客戶端和目標(biāo)對象之間增加一個(gè)代理對象,會(huì)造成請求處理速度變慢
??????? 3.增加了系統(tǒng)的復(fù)雜度
角色職責(zé)
抽象主題(Subject)類:通過接口或抽象類聲明真實(shí)主題和代理對象實(shí)現(xiàn)的業(yè)務(wù)方法。
真實(shí)主題(Real Subject)類:實(shí)現(xiàn)了抽象主題中的具體業(yè)務(wù),是代理對象所代表的真實(shí)對象,是最終要引用的對象。
代理(Proxy)類:提供了與真實(shí)主題相同的接口,其內(nèi)部含有對真實(shí)主題的引用,它可以訪問、控制或擴(kuò)展真實(shí)主題的功能
實(shí)現(xiàn)
package proxy;
public class ProxyTest {
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.Request();
}
}
//抽象主題
interface Subject {
void Request();
}
//真實(shí)主題
class RealSubject implements Subject {
public void Request() {
System.out.println("訪問真實(shí)主題方法...");
}
}
//代理
class Proxy implements Subject {
private RealSubject realSubject;
public void Request() {
if (realSubject == null) {
realSubject = new RealSubject();
}
preRequest();
realSubject.Request();
postRequest();
}
public void preRequest() {
System.out.println("訪問真實(shí)主題之前的預(yù)處理。");
}
public void postRequest() {
System.out.println("訪問真實(shí)主題之后的后續(xù)處理。");
}
}
?
運(yùn)用場景
1.AOP:通過定義切面、切入點(diǎn)和通知等,Spring AOP在運(yùn)行時(shí)生成代理對象,將切面邏輯織入到目標(biāo)對象的方法調(diào)用中。代理對象在方法調(diào)用前后執(zhí)行附加操作,如日志記錄、性能監(jiān)控等。
2.動(dòng)態(tài)代理(JDK動(dòng)態(tài)代理、CGLIB代理):當(dāng)Bean類實(shí)現(xiàn)了接口時(shí),Spring使用JDK動(dòng)態(tài)代理來為Bean生成代理對象;當(dāng)Bean類沒有實(shí)現(xiàn)接口時(shí),Spring使用CGLIB代理來生成代理對象。
?
外觀模式
簡介
????????提供了統(tǒng)一的接口,用來訪問子系統(tǒng)中的一群接口。外觀模式定義了一個(gè)高層接口,讓子系統(tǒng)更加容易使用。
角色職責(zé)
????????外觀角色:提供一個(gè)外觀接口,對外提供一個(gè)易于客戶端訪問的接口,對內(nèi)可以訪問子系統(tǒng)中的所有功能。
????????子系統(tǒng)角色:子系統(tǒng)在整個(gè)系統(tǒng)中可以是一個(gè)或者多個(gè)模塊,每個(gè)模塊都是若干類組成,這些類之間可能相互復(fù)雜的關(guān)系。
????????客戶端:外觀接口調(diào)用測試者。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
??????? 1.減少系統(tǒng)相互依賴
??????? 2.提高靈活性
??????? 3.提高了安全性
缺點(diǎn):
??????? 在不對外觀類進(jìn)行抽象的時(shí)候,如果需要添加新的子系統(tǒng),就需要對外觀類進(jìn)行修改,違背了開閉原則
實(shí)現(xiàn)
public class CPU {
public void startup(){
System.out.println("cpu startup!");
}
public void shutdown(){
System.out.println("cpu shutdown!");
}
}
public class Memory {
public void startup(){
System.out.println("memory startup!");
}
public void shutdown(){
System.out.println("memory shutdown!");
}
}
public class Disk {
public void startup(){
System.out.println("disk startup!");
}
public void shutdown(){
System.out.println("disk shutdown!");
}
}
public class Computer {
private CPU cpu;
private Memory memory;
private Disk disk;
public Computer(){
cpu = new CPU();
memory = new Memory();
disk = new Disk();
}
public void startup(){
System.out.println("start the computer!");
cpu.startup();
memory.startup();
disk.startup();
System.out.println("start computer finished!");
}
public void shutdown(){
System.out.println("begin to close the computer!");
cpu.shutdown();
memory.shutdown();
disk.shutdown();
System.out.println("computer closed!");
}
}
//測試
public class User {
public static void main(String[] args) {
Computer computer = new Computer();
computer.startup();
computer.shutdown();
}
}
????????如果沒有Computer類,那么,CPU、Memory、Disk他們之間將會(huì)相互持有實(shí)例,產(chǎn)生關(guān)系,這樣會(huì)造成嚴(yán)重的依賴,修改一個(gè)類,可能會(huì)帶來其他類的修改,這不是我們想要看到的,有了Computer類,他們之間的關(guān)系被放在了Computer類里,這樣就起到了解耦的作用,這,就是外觀模式!
使用場景
??????? 1.對分層結(jié)構(gòu)系統(tǒng)構(gòu)建時(shí),使用外觀模式定義子系統(tǒng)中每層的入口點(diǎn)可以簡化子系統(tǒng)之間的依賴關(guān)系
??????? 2.當(dāng)一個(gè)復(fù)雜系統(tǒng)的子系統(tǒng)很多時(shí),外觀模式可以為系統(tǒng)設(shè)計(jì)一個(gè)簡單的接口供外界訪問文章來源:http://www.zghlxwxcb.cn/news/detail-694636.html
??????? 3.當(dāng)客戶端與多個(gè)子系統(tǒng)之間存在很大的聯(lián)系時(shí),引入外觀模式可將它們分離,從而提高子系統(tǒng)的獨(dú)立性和可移植性文章來源地址http://www.zghlxwxcb.cn/news/detail-694636.html
到了這里,關(guān)于設(shè)計(jì)模式之代理模式與外觀模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!