《大话设计模式》——读后感 为别人做嫁衣?——静态代理模式
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)就是为其他对象提供一种代理以控制对这个对象的访问。 比如: 智能指针 为别人做嫁衣