您的位置:首页 > 其它

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

2017-07-04 14:30 281 查看
什么是代理模式:



 

代理模式结构图:



 

 

 直接上代码:

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?

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: