如果你交给某人一个程序,你将折磨他一整天,如果你教某人如何编写程序,你将折磨他一辈子。
最近学习了设计模式后,发现自己JAVA基础不够扎实,回头开始看《Thinking in java》,吐槽一下。。。文章的翻译好僵硬。。这书真的是推荐给初学者的么。
一、依据故事我所设计的代理模式。
故事:李四请张三帮忙以他的名义把东西送给娇娇。
代理模式的定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。
利用接口实现。。
追求者代理
/**
* Created with Intellij IDEA.
* User : Yebinghuan
* Created on 2017/8/5.
* Description :
* 假设这个是送礼的人 张三
* 他有这些行为但是没有真正的实体东西
*/
public interface Suitors {
/**
* 送花
*/
public void sendFlower();
/**
* 送人头
*/
public void sendHead();
}
真正的追求者
/**
* Created with Intellij IDEA.
* User : Yebinghuan
* Created on 2017/8/5.
* Description :
* 这个是真正的追求者 李四
* 他有具体的东西但是他没有去送
*/
public class SuitorsImpl implements Suitors {
String name;
public SuitorsImpl(String name){
this.name=name;
}
@Override
public void sendFlower() {
System.err.println("送花给"+name);
}
@Override
public void sendHead() {
System.err.println("送人头给"+name);
}
}
Suitors suitors=new SuitorsImpl("娇娇");
//追求者张三
suitors.sendFlower();
suitors.sendHead();
=。=感觉代理是达到了,但是感觉有点不像面向对象, 接口不能作为一个具体对象来看待,应该另外创建一个对象张三来替李四送东西。
那么我们需要新增加一个对象为张三
张三具体类
/**
* Created with Intellij IDEA.
* User : Yebinghuan
* Created on 2017/8/5.
* Description :
* 该对象为张三 他要替李四送礼
*/
public class ZhangsanImpl implements Suitors{
LisiImpl suitors;
public ZhangsanImpl(String name) {
//我们要拿到李四的请求
suitors= new LisiImpl(name);
}
@Override
public void sendFlower() {
//李四想把花送给娇娇,通过张三的手
System.err.println("张三");
suitors.sendFlower();
}
@Override
public void sendHead() {
System.err.println("张三");
suitors.sendHead();
}
}
张三
送花给娇娇
张三
送人头给娇娇
该模式定义:李四给了张三xx东西,并要求由 张三去送给娇娇!
JDK中用到代理模式的有
• java.lang.reflect.Proxy
•java.rmi.*
二、代理模式和运用场景分析
1、任务清晰,张三只需要知道他要把东西送给娇娇,压根不用管花去哪买的。
2、扩展性高,张三能帮忙,那么只要条件符合换个王五也一样能做。
3、 私密性质(个人感觉是设计核心理念),除了娇娇,张三,李四,知道这花是李四送给娇娇的。在其他人眼里 是张三送花给娇娇
根据这3个特性,我最先想到的应用场景
权限控制 的设计方案可以这样玩
全部的权限----李四类
根据调用者权限请多个代理----张三类
加上策略模式,根据不同的调用对象的权限反馈不同的代理。
大致是这种感觉,以上是我读完《大话设计模式之代理模式的读后感》