天天看點

代理模式

《大話設計模式》閱讀筆記和總結。原書是C#編寫的,本人用Java實作了一遍,包括每種設計模式的UML圖實作和示例代碼實作。

目錄:

設計模式 Github位址: DesignPattern

說明

定義:代理模式(Proxy),為其他對象提供一種代理以控制對這個對象的通路。

UML圖:

代理模式

代理模式UML圖.png

代碼實作:

Subject類,定義了RealSubject和Proxy的共用接口,這樣就在任何使用RealSubject的地方都可以使用Proxy

abstract class Subject{
    public abstract void Request();
}
           

RealSubject類,定義Proxy所代表的真實實體

class RealSubject extends Subject{

    @Override
    public void Request() {
        System.out.println("真實的請求");
    }
}
           

Proxy類,儲存一個引用使得代理可以通路實體,并提供一個與Subject的接口相同的接口,這樣代理就可以用來替代實體

class ProxyI extends Subject{
    private RealSubject realSubject;

    @Override
    public void Request() {
        if (realSubject == null){
            realSubject = new RealSubject();
        }
        realSubject.Request();
    }
}
           

用戶端代碼

public class ProxyPattern {
    public static void main(String[] args){
        ProxyI proxyI = new ProxyI();
        proxyI.Request();
    }
}
           

運作結果

真實的請求
           

示例

例子:小賈喜歡嬌嬌,但是不敢親自表白,于是他讓小戴替他送洋娃娃、送鮮花、送巧克力給嬌嬌。用程式模拟這個過程。

代理模式

代理模式示例UML圖.png

代理接口

public interface GiveGift {
    void giveDolls();
    void giveFlowers();
    void giveChocolate();
}
           

被追求者類

public class SchoolGirl {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
           

追求者類

public class Pursuit implements GiveGift {
    private SchoolGirl mm;

    public Pursuit(SchoolGirl mm) {
        this.mm = mm;
    }

    @Override
    public void giveDolls() {
        System.out.println(mm.getName()+",送你洋娃娃");
    }

    @Override
    public void giveFlowers() {
        System.out.println(mm.getName()+",送你鮮花");
    }

    @Override
    public void giveChocolate() {
        System.out.println(mm.getName()+",送你巧克力");
    }
}
           

代理類

public class Proxy implements GiveGift{
    private Pursuit gg;
    public Proxy(SchoolGirl mm){
        gg = new Pursuit(mm);
    }

    @Override
    public void giveDolls() {
        gg.giveDolls();
    }

    @Override
    public void giveFlowers() {
        gg.giveFlowers();
    }

    @Override
    public void giveChocolate() {
        gg.giveChocolate();
    }
}
           
public class Main {
    public static void main(String[] args){
        SchoolGirl jiaojiao = new SchoolGirl();
        jiaojiao.setName("李嬌嬌");
        Proxy proxy = new Proxy(jiaojiao);
        proxy.giveDolls();
        proxy.giveFlowers();
        proxy.giveChocolate();
    }
}
           

運作結果:

李嬌嬌,送你洋娃娃
李嬌嬌,送你鮮花
李嬌嬌,送你巧克力