【结构型模式】《大话设计模式》——读后感 (4)为别人做嫁衣?——静态代理模式(1)

什么是代理模式:

 

代理模式结构图:

 

 

 直接上代码:

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?

 

posted @ 2017-06-21 09:52  街头小瘪三  阅读(197)  评论(0编辑  收藏  举报