摘要:但它們還是具有不同的設(shè)計(jì)目的。模式構(gòu)成一個(gè)對(duì)象并為用戶提供一致的接口。另外,著重控制對(duì)象。是將需要裝飾的對(duì)象通過(guò)構(gòu)造函數(shù)的方式傳入。參考文獻(xiàn)大話設(shè)計(jì)模式模式與模式的異同之我見代理模式裝飾器模式
Proxy代理模式
代理模式,為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)
看代碼更清晰
//Main函數(shù) public class Main { public static void main(String[] args) { Printable p = new PrinterProxy("Alice"); System.out.println("Print by:"+p.getPrinterName()); p.setPrinterName("Bob"); System.out.println("Print by:"p.getPrinterName()); p.print("Hello, world."); } } //Printable接口 public interface Printable { public abstract void setPrinterName(String name); public abstract String getPrinterName(); public abstract void print(String string); } //重點(diǎn)來(lái)了 //PrinterProxy代理類 public class PrinterProxy implements Printable { private String name; private Printer real; public PrinterProxy() { } public PrinterProxy(String name) { this.name = name; } public synchronized void setPrinterName(String name) { if (real != null) { real.setPrinterName(name); } this.name = name; } public String getPrinterName() { return name; } public void print(String string) { realize(); real.print(string); } private synchronized void realize() { if (real == null) { real = new Printer(name); } } } //Printer public class Printer implements Printable { private String name; public Printer() { heavyJob("Printer,heavyJob"); } public Printer(String name) { this.name = name; heavyJob("Printer?(" + name + ")?"); } public void setPrinterName(String name) { this.name = name; } public String getPrinterName() { return name; } public void print(String string) { System.out.println("=== " + name + " ==="); System.out.println(string); } private void heavyJob(String msg) { System.out.print(msg); for (int i = 0; i < 5; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { } System.out.print("."); } System.out.println("end"); } }
講到proxy就不得不提到decorator裝飾模式。這兩種模式很相似,經(jīng)常會(huì)混淆。
Decorator裝飾模式裝飾模式,動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé),就增加功能來(lái)說(shuō),裝飾模式比生成子類更靈活。
對(duì)于Component來(lái)說(shuō),是無(wú)需知道Decorator的存在,Decorator是從外類來(lái)擴(kuò)展Componnent類的功能。
看代碼
//Main public class Main { public static void main(String[] args) { Display b1 = new StringDisplay("Hello, world."); Display b2 = new SideBorder(b1, "#"); Display b3 = new FullBorder(b2); b1.show(); b2.show(); b3.show(); Display b4 = new SideBorder( new FullBorder( new FullBorder( new SideBorder( new FullBorder( new StringDisplay("hello") ), "*" ) ) ), "/" ); b4.show(); } } //Display public abstract class Display { public abstract int getColumns(); public abstract int getRows(); public abstract String getRowText(int row); public final void show() { for (int i = 0; i < getRows(); i++) { System.out.println(getRowText(i)); } } } //Border public abstract class Border extends Display { protected Display display; protected Border(Display display) { this.display = display; } } //這里只舉一個(gè)實(shí)現(xiàn)類的例子 public class SideBorder extends Border { private char borderChar; public SideBorder(Display display, char ch) { super(display); this.borderChar = ch; } public int getColumns() { return 1 + display.getColumns() + 1; } public int getRows() { return display.getRows(); } public String getRowText(int row) { return borderChar + display.getRowText(row) + borderChar; } }Proxy && Decorator
GoF提到它們的區(qū)別時(shí),說(shuō)到:
這兩種模式都描述了怎樣為對(duì)象提供一定程度上的間接引用,它們的實(shí)現(xiàn)部分都保留了指向另一個(gè)對(duì)象的指針,向這個(gè)對(duì)象發(fā)送請(qǐng)求。但它們還是具有不同的設(shè)計(jì)目的。
Proxy模式構(gòu)成一個(gè)對(duì)象并為用戶提供一致的接口。但與Decoratro模式不同的是,Proxy模式不能動(dòng)態(tài)的添加或分離性質(zhì),也不是為遞歸組合而設(shè)計(jì)的。它的目的是,當(dāng)直接訪問(wèn)一個(gè)不方便或不符合需要時(shí),為這個(gè)實(shí)體提供一個(gè)替代者。
Proxy從語(yǔ)義上來(lái)說(shuō),就是一個(gè)代理類,我不需要知道你具體是哪個(gè)類實(shí)現(xiàn)的,我只需要能夠訪問(wèn)這個(gè)提供服務(wù)的代理對(duì)象就可以。另外,Proxy著重控制對(duì)象。
Decorator更注重于裝飾。是將需要裝飾的對(duì)象通過(guò)構(gòu)造函數(shù)的方式傳入。
比較一下上述代碼。注意裝飾器和代理的初始化位置和方式
//Proxy在執(zhí)行前后可以再做其他事,增強(qiáng)能力,改變的是行為。
//Decorator 目的是為了改變print的內(nèi)容,先get內(nèi)容,在get內(nèi)容的方法中進(jìn)行修改。
中介者模式,用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯示地相互引用,從而使其耦合松散,而且可以獨(dú)立改變它們之間的交互。
把對(duì)象之間復(fù)雜的耦合寫到mediator中,讓mediator與其他對(duì)象的關(guān)聯(lián)是整齊統(tǒng)一的。從而提高可用性和擴(kuò)展性。
mediator與facade之間的區(qū)別都是是把復(fù)雜的東西隱藏起來(lái),讓別人看起來(lái)比較簡(jiǎn)單。都沒(méi)有簡(jiǎn)單化。只是進(jìn)行隱藏。【需要考慮代價(jià)】
mediator是把對(duì)象之間復(fù)雜的關(guān)系都聯(lián)系起來(lái)。相當(dāng)于集線器。把所有東西和集線器聯(lián)系起來(lái)。邏輯更為復(fù)雜。【仔細(xì)衡量是否一定需要。否則會(huì)有很大復(fù)雜性?!?br>facade是把外面的東西和內(nèi)部的東西分開簡(jiǎn)單化。類似于包裝盒。不管內(nèi)部多復(fù)雜,對(duì)外只需要一個(gè)接口,外部不需要關(guān)心內(nèi)部是如何實(shí)現(xiàn)。
參考文獻(xiàn):
《大話設(shè)計(jì)模式》
Decorator模式與Proxy模式的異同之我見
代理模式 & 裝飾器模式 (Proxy & Decorator)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/65975.html
摘要:大意就是作者把種不斷的重組歸納抽象直道最后抽象為一種設(shè)計(jì)模式,。而所有的關(guān)注的核心問(wèn)題就是如何控制信息流但是我個(gè)人認(rèn)為核心是如何解耦。再根據(jù)信息流劃分出對(duì)象在系統(tǒng)中擔(dān)任的種角色,。所以歸為一種核心所有的的職責(zé)都是控制。 Overview 今天看了YouTube上的一個(gè)講Design Pattern的視頻,把這個(gè)視頻的大意給大家分享一下,該視頻的作者是Anthony Ferrara。 ...
摘要:工廠設(shè)計(jì)模式工廠設(shè)計(jì)模式,主要用于進(jìn)行實(shí)例化對(duì)象時(shí)的解耦操作,避免使用關(guān)鍵字實(shí)例化對(duì)象,通過(guò)反射,根據(jù)類名稱動(dòng)態(tài)創(chuàng)建對(duì)象示例靜態(tài)工廠模式構(gòu)造方法私有化獲取指定類名稱的對(duì)象動(dòng)態(tài)代理模式動(dòng)態(tài)代理模式,主要用于對(duì)同一接口子類的相同邏輯進(jìn)行代理操作 工廠設(shè)計(jì)模式 工廠設(shè)計(jì)模式,主要用于進(jìn)行實(shí)例化對(duì)象時(shí)的解耦操作,避免使用new關(guān)鍵字實(shí)例化對(duì)象,通過(guò)反射,根據(jù)類名稱動(dòng)態(tài)創(chuàng)建對(duì)象 示例: pa...
摘要:創(chuàng)建型設(shè)計(jì)模式通過(guò)控制這個(gè)對(duì)象的創(chuàng)建方式來(lái)解決此問(wèn)題。抽象工廠模式建造者模式工廠方法模式多例模式對(duì)象池模式原型模式簡(jiǎn)單工廠模式單例模式靜態(tài)工廠模式結(jié)構(gòu)型在軟件工程中,結(jié)構(gòu)型設(shè)計(jì)模式是通過(guò)識(shí)別實(shí)體之間關(guān)系來(lái)簡(jiǎn)化設(shè)計(jì)的設(shè)計(jì)模式。 創(chuàng)建型在軟件工程中,創(chuàng)建型設(shè)計(jì)模式是處理對(duì)象創(chuàng)建機(jī)制的設(shè)計(jì)模式,試圖以適當(dāng)?shù)姆绞絹?lái)創(chuàng)建對(duì)象。對(duì)象創(chuàng)建的基本形式可能會(huì)帶來(lái)設(shè)計(jì)問(wèn)題,亦或增加了設(shè)計(jì)的復(fù)雜度。創(chuàng)建...
摘要:設(shè)計(jì)模式目的為了代碼可重用性讓代碼更容易被他人理解保證代碼可靠性設(shè)計(jì)原則設(shè)計(jì)原則是設(shè)計(jì)模式為了達(dá)到其目的,所實(shí)現(xiàn)的一些準(zhǔn)則。 設(shè)計(jì)模式簡(jiǎn)介 1.什么是設(shè)計(jì)模式 設(shè)計(jì)模式對(duì)是經(jīng)驗(yàn)的總結(jié),是一套被反復(fù)使用的、多數(shù)人知曉的、經(jīng)過(guò)分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。代表了最佳的實(shí)戰(zhàn)。 2.提出及GOF 在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnso...
摘要:建議參看學(xué)習(xí)創(chuàng)建型模式工廠模式抽象工廠模式單例模式建造者模式原型模式結(jié)構(gòu)型模式適配器模式接口轉(zhuǎn)換橋接模式過(guò)濾器模式組合模式裝飾器模式外觀模式門面模式前臺(tái)接待享元模式代理模式行為型模式責(zé)任鏈模式工作流命令模式解釋器模式 建議參看github學(xué)習(xí) 1.創(chuàng)建型模式(creational) 工廠模式(factory)抽象工廠模式(abstract factory)單例模式(singleton)...
閱讀 912·2023-04-25 22:57
閱讀 3138·2021-11-23 10:03
閱讀 684·2021-11-22 15:24
閱讀 3248·2021-11-02 14:47
閱讀 2988·2021-09-10 11:23
閱讀 3196·2021-09-06 15:00
閱讀 4042·2019-08-30 15:56
閱讀 3404·2019-08-30 15:52