1. 程式人生 > >《大話設計模式》——讀後感 (4)為別人做嫁衣?——靜態代理模式(1)

《大話設計模式》——讀後感 (4)為別人做嫁衣?——靜態代理模式(1)

即使 pri 為我 div 結構 apple .cn string 想要

什麽是代理模式:

技術分享

代理模式結構圖:

技術分享

直接上代碼:

GiveGift接口:

package com.sjmx.staticProxy;

public interface GiveGift {

    void giveDolls();
    void giveFlows();
    void giveChocolate();
    
}

真實實體:

package com.sjmx.staticProxy;

public class Pursuit implements GiveGift {
    
    SchoolGirl girl;
    private
String name; public Pursuit(String name ,SchoolGirl girl){ this.girl = girl; this.name = name; } @Override public void giveDolls() { System.out.println(girl.getName() + ","+ this.name +"送你一個dolls"); } @Override public void giveFlows() { System.out.println(girl.getName()
+ ","+ this.name +"送你一個Flows"); } @Override public void giveChocolate() { System.out.println(girl.getName() + ","+ this.name +"送你一個Chocolate"); } }

代理:

package com.sjmx.staticProxy;

public class Proxy implements GiveGift{
    
    Pursuit gg ;
    
    public Proxy(String name ,SchoolGirl girl ) {
        gg 
= new Pursuit(name,girl); } public void giveDolls() { gg.giveDolls(); } public void giveFlows() { gg.giveFlows(); } public void giveChocolate() { gg.giveChocolate(); } }

虛構的實體,真實對象想要對此實體進行某些操作:

package com.sjmx.staticProxy;

public class SchoolGirl {
    
    private String name;

    public String getName() {
        return name;
    }

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

客戶端代碼:

package com.sjmx.staticProxy;

public class Client {
    
    public static void main(String[] args) {
        
        SchoolGirl girl = new SchoolGirl();
        girl.setName("林風嬌");
        
        Proxy p = new Proxy("柯南",girl);
        p.giveChocolate();
        p.giveDolls();
        p.giveFlows();
        System.out.println("--------------");
        
        Proxy p2 = new Proxy("易烊千璽",girl);
        p2.giveChocolate();
        p2.giveDolls();
        p2.giveFlows();
        System.out.println("--------------");
        
        Proxy p3 = new Proxy("王源",girl);
        p3.giveChocolate();
        p3.giveDolls();
        p3.giveFlows();
        System.out.println("--------------");
        
    }
}

運行結果:

技術分享

下面我們來分析一下代碼實現:

1、Pursuit真實實體實現了接口GiveGift,而Proxy也實現了接口GiveGift,並且代理類還擁有成員變量Pursuit。單單從這代碼結構看,是不是和裝飾模式有一點相似?

2、為什麽Pursuit實現GiveGift,而Proxy也要去實現GiveGift呢?因為他們兩個要做的事情是相同的,房東可以租房子,中介也可以租房子,只是中介是代理房東在操作而已,道理一樣!那我想知道,Proxy不去實現GiveGift接口行不行呢?答案是可以的,因為我代碼根本就沒有出現 @Override字樣;即使出現了也沒關系,去掉就可以了(建議是去實現GiveGift接口,省事啊

3、客戶端知乎要知道Proxy能租房子就行了,我根本不需要知道Pursuit的實例對象到底是誰,有可能是Pursuit1、2 、3、4、5....N呢,我客戶根本不關心,我只需要知道Proxy即可,耦合度大大降低。

4、再來說說不好的地方,Proxy持有的是Pursuit,那假如我還有其他的實體呢?比如A,B,C,D,如果是這樣,僅有的一個Proxy是根本無法代理的,因為在代理類的構造方法中是要實例化具體的實現實體對象的。有人會說,那我多寫幾個Proxy好了,如果是這樣的話,那我有1000個具體實體,那你的Proxy是不是也要有1000個呢?這樣的量是面向對象無法接受的;

5、還有一個不好的地方,剛剛說的是同一個接口的不同實現類;現在如果我有多個接口,每個接口實現類也不同,你又如何去代理,難道還要寫多個Proxy?

《大話設計模式》——讀後感 (4)為別人做嫁衣?——靜態代理模式(1)