摘要:但它們還是具有不同的設(shè)計目的。模式構(gòu)成一個對象并為用戶提供一致的接口。另外,著重控制對象。是將需要裝飾的對象通過構(gòu)造函數(shù)的方式傳入。參考文獻大話設(shè)計模式模式與模式的異同之我見代理模式裝飾器模式
Proxy代理模式
代理模式,為其他對象提供一種代理以控制對這個對象的訪問
看代碼更清晰
//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); } //重點來了 //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)常會混淆。
Decorator裝飾模式裝飾模式,動態(tài)地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更靈活。
對于Component來說,是無需知道Decorator的存在,Decorator是從外類來擴展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; } } //這里只舉一個實現(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ū)別時,說到:
這兩種模式都描述了怎樣為對象提供一定程度上的間接引用,它們的實現(xiàn)部分都保留了指向另一個對象的指針,向這個對象發(fā)送請求。但它們還是具有不同的設(shè)計目的。
Proxy模式構(gòu)成一個對象并為用戶提供一致的接口。但與Decoratro模式不同的是,Proxy模式不能動態(tài)的添加或分離性質(zhì),也不是為遞歸組合而設(shè)計的。它的目的是,當直接訪問一個不方便或不符合需要時,為這個實體提供一個替代者。
Proxy從語義上來說,就是一個代理類,我不需要知道你具體是哪個類實現(xiàn)的,我只需要能夠訪問這個提供服務的代理對象就可以。另外,Proxy著重控制對象。
Decorator更注重于裝飾。是將需要裝飾的對象通過構(gòu)造函數(shù)的方式傳入。
比較一下上述代碼。注意裝飾器和代理的初始化位置和方式
//Proxy在執(zhí)行前后可以再做其他事,增強能力,改變的是行為。
//Decorator 目的是為了改變print的內(nèi)容,先get內(nèi)容,在get內(nèi)容的方法中進行修改。
中介者模式,用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯示地相互引用,從而使其耦合松散,而且可以獨立改變它們之間的交互。
把對象之間復雜的耦合寫到mediator中,讓mediator與其他對象的關(guān)聯(lián)是整齊統(tǒng)一的。從而提高可用性和擴展性。
mediator與facade之間的區(qū)別都是是把復雜的東西隱藏起來,讓別人看起來比較簡單。都沒有簡單化。只是進行隱藏?!拘枰紤]代價】
mediator是把對象之間復雜的關(guān)系都聯(lián)系起來。相當于集線器。把所有東西和集線器聯(lián)系起來。邏輯更為復雜?!咀屑毢饬渴欠褚欢ㄐ枰?。否則會有很大復雜性。】
facade是把外面的東西和內(nèi)部的東西分開簡單化。類似于包裝盒。不管內(nèi)部多復雜,對外只需要一個接口,外部不需要關(guān)心內(nèi)部是如何實現(xiàn)。
參考文獻:
《大話設(shè)計模式》
Decorator模式與Proxy模式的異同之我見
代理模式 & 裝飾器模式 (Proxy & Decorator)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/65975.html
摘要:大意就是作者把種不斷的重組歸納抽象直道最后抽象為一種設(shè)計模式,。而所有的關(guān)注的核心問題就是如何控制信息流但是我個人認為核心是如何解耦。再根據(jù)信息流劃分出對象在系統(tǒng)中擔任的種角色,。所以歸為一種核心所有的的職責都是控制。 Overview 今天看了YouTube上的一個講Design Pattern的視頻,把這個視頻的大意給大家分享一下,該視頻的作者是Anthony Ferrara。 ...
摘要:工廠設(shè)計模式工廠設(shè)計模式,主要用于進行實例化對象時的解耦操作,避免使用關(guān)鍵字實例化對象,通過反射,根據(jù)類名稱動態(tài)創(chuàng)建對象示例靜態(tài)工廠模式構(gòu)造方法私有化獲取指定類名稱的對象動態(tài)代理模式動態(tài)代理模式,主要用于對同一接口子類的相同邏輯進行代理操作 工廠設(shè)計模式 工廠設(shè)計模式,主要用于進行實例化對象時的解耦操作,避免使用new關(guān)鍵字實例化對象,通過反射,根據(jù)類名稱動態(tài)創(chuàng)建對象 示例: pa...
摘要:創(chuàng)建型設(shè)計模式通過控制這個對象的創(chuàng)建方式來解決此問題。抽象工廠模式建造者模式工廠方法模式多例模式對象池模式原型模式簡單工廠模式單例模式靜態(tài)工廠模式結(jié)構(gòu)型在軟件工程中,結(jié)構(gòu)型設(shè)計模式是通過識別實體之間關(guān)系來簡化設(shè)計的設(shè)計模式。 創(chuàng)建型在軟件工程中,創(chuàng)建型設(shè)計模式是處理對象創(chuàng)建機制的設(shè)計模式,試圖以適當?shù)姆绞絹韯?chuàng)建對象。對象創(chuàng)建的基本形式可能會帶來設(shè)計問題,亦或增加了設(shè)計的復雜度。創(chuàng)建...
摘要:設(shè)計模式目的為了代碼可重用性讓代碼更容易被他人理解保證代碼可靠性設(shè)計原則設(shè)計原則是設(shè)計模式為了達到其目的,所實現(xiàn)的一些準則。 設(shè)計模式簡介 1.什么是設(shè)計模式 設(shè)計模式對是經(jīng)驗的總結(jié),是一套被反復使用的、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。代表了最佳的實戰(zhàn)。 2.提出及GOF 在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnso...
閱讀 804·2023-04-25 22:57
閱讀 3057·2021-11-23 10:03
閱讀 620·2021-11-22 15:24
閱讀 3164·2021-11-02 14:47
閱讀 2906·2021-09-10 11:23
閱讀 3124·2021-09-06 15:00
閱讀 3947·2019-08-30 15:56
閱讀 3328·2019-08-30 15:52