国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

設(shè)計模式第三彈【Proxy,Decorator,Mediator】

wemall / 365人閱讀

摘要:但它們還是具有不同的設(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中,讓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

相關(guān)文章

  • Design Pattern的萬劍歸宗 => Mediator

    摘要:大意就是作者把種不斷的重組歸納抽象直道最后抽象為一種設(shè)計模式,。而所有的關(guān)注的核心問題就是如何控制信息流但是我個人認為核心是如何解耦。再根據(jù)信息流劃分出對象在系統(tǒng)中擔任的種角色,。所以歸為一種核心所有的的職責都是控制。 Overview 今天看了YouTube上的一個講Design Pattern的視頻,把這個視頻的大意給大家分享一下,該視頻的作者是Anthony Ferrara。 ...

    yuanzhanghu 評論0 收藏0
  • 常用設(shè)計模式

    摘要:工廠設(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...

    fizz 評論0 收藏0
  • PHP 設(shè)計模式

    摘要:創(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)建...

    sewerganger 評論0 收藏0
  • 設(shè)計模式

    摘要:設(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...

    enrecul101 評論0 收藏0
  • 設(shè)計模式

    摘要:建議參看學習創(chuàng)建型模式工廠模式抽象工廠模式單例模式建造者模式原型模式結(jié)構(gòu)型模式適配器模式接口轉(zhuǎn)換橋接模式過濾器模式組合模式裝飾器模式外觀模式門面模式前臺接待享元模式代理模式行為型模式責任鏈模式工作流命令模式解釋器模式 建議參看github學習 1.創(chuàng)建型模式(creational) 工廠模式(factory)抽象工廠模式(abstract factory)單例模式(singleton)...

    pekonchan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<