《大话设计模式》——读后感 为别人做嫁衣?——静态代理模式

Posted 街头小瘪三

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《大话设计模式》——读后感 为别人做嫁衣?——静态代理模式相关的知识,希望对你有一定的参考价值。

什么是代理模式:

 

代理模式结构图:

 

 

 直接上代码:

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?

 

以上是关于《大话设计模式》——读后感 为别人做嫁衣?——静态代理模式的主要内容,如果未能解决你的问题,请参考以下文章

6,代理模式(Proxy Pattern)就是为其他对象提供一种代理以控制对这个对象的访问。 比如: 智能指针 为别人做嫁衣

大话设计模式之简单工厂读后感

《大话设计模式》——读后感 牛市股票还会亏钱?——外观模式

大话设计模式之策略模式读后感

行为型模式《大话设计模式》——读后感 (15)烤羊肉串引来的思考?——命令模式

AOP