读书人

简简单单 署理模式

发布时间: 2012-10-28 09:54:44 作者: rapoo

简简单单 代理模式

? 辛苦打了很多字不小心删掉了,简单点说吧,就是...还是直接看代码...

接口是标准,说明一客户想制作一软件,但是做软件要求有计算机编程能力ComputerSoft ,

public interface ComputerSoft {public String programing(int Money,String needs);}

?这样,客户通过出钱和需求,来制作一个软件,于是找到了项目经理ProjectManager

public class ProjectManager implements ComputerSoft{     public String programing(int money, String needs) {     return sourcecode;}

??很明显项目经理多年不干程序,除了吃什么都不会,于是雇来员工,员工的会编程啊,所以有

?

public class CodingWorker implements ComputerSoft{public String programing(int Money, String needs) {//programing.......return "sourceCode";}}

?要项目经理干吗的....?所以项目经理变成

public class ProjectManager implements ComputerSoft{ComputerSoft pg;//雇用员工...public void setPG(ComputerSoft PG) {this.pg = PG;}//开干..public String programing(int money, String needs) {money = money - 2000;String sourcecode =pg.programing(money, needs);return sourcecode;}}

?

项目经理就是代理类,这就是一个简单代理模式

16 楼 flyzht 2009-06-10 代理类承担了一些外围职责,很多时候是检查之类的逻辑,体现了OO中职责分开原则(SRP) 17 楼 zrlovekmy 2009-07-05 我有一个问题 怎么说呢 第四张图 为什么项目经理持有的是ComputerSoft 为什么不是CodingWorker呢?? 前面都很清楚 到第4张表一下就迷糊了 - - 5555 18 楼 iaimstar 2009-07-06 zrlovekmy 写道我有一个问题 怎么说呢 第四张图 为什么项目经理持有的是ComputerSoft 为什么不是CodingWorker呢?? 前面都很清楚 到第4张表一下就迷糊了 - - 5555
codingWorker实现了ComputerSoft 丫,
从业务上面讲
项目经理需要的 编程 而不是程序员本人,只要是能编程的,是人是马无所谓

从解耦来讲
如果持有的是codingWorker,那项目经理手下还有个分项目经理怎么办?召来编程的是codingET或者codingHorse怎么办?
难道要修改代码么? 19 楼 leaobreak 2009-07-16 <p>很好哇!</p> 20 楼 JackenCai 2009-07-16 这个例子作为代理模式,觉得不是很恰当。代理模式的作用主要是用一个对象的替代者或占位符为代表,实现对该对象访问的控制。比较多的应用主要有远程代理、代理开销比对大的对象的创建、JDK的动态代理等,但无论是哪一种,都只是对被代理者进行相关的控制,不会去改变他的形为。如果从上面代码实现的功能,我觉得更接近装饰模式,在不改变接口的情况下,增加原有的功能,但类的结构跟装饰模式稍有差别。 21 楼 xu_zh_h 2009-07-23 这个比喻不能体现代理模式意图。另外代码同样不是代理模式 22 楼 iaimstar 2009-07-23 xu_zh_h 写道这个比喻不能体现代理模式意图。另外代码同样不是代理模式
求代理模式的代码 23 楼 xu_zh_h 2009-07-23 可以参考相关书籍,认真对比 24 楼 iaimstar 2009-07-23 xu_zh_h 写道可以参考相关书籍,认真对比
我的意思你来个关于本例代理模式装饰,我好对比对比 25 楼 hongbiangoal 2009-07-24 鄙人愚见 大家讨论,,我感觉代理模式应这样:
真实类与代理类共同的接口:
public interface ComputerSoft {
public String programing(int Money,String needs);
}
真实类
public class CodingWorker implements ComputerSoft{
public String programing(int Money, String needs) {
return "sourceCode";
}
}
代理类
public class ProjectManager implements ComputerSoft{

CodingWorker worker;
//开干前 经理要分发任务
public void assign(){
System.out.println("assign....");
}
//干完后验收
public void check(){
System.out.println("check....");
}
public void
//开干..
public String programing(int money, String needs) {
assign();
if(worker==null)worker = new CodingWorker();
worker.programing(money,needs);
check();
}

} 26 楼 favor 2009-08-04 各位继续讨论呀,学习中呀!感觉你们讨论的很不错,继续呀. 27 楼 zhengsiry 2009-08-04 我又张见识了。。。java新人路过顺便学习 28 楼 iaimstar 2009-08-05 再次惊现帖子消失啊,,,回复都不见咯 29 楼 zhy20045923 2009-08-24 public class ProjectManager implements ComputerSoft{

ComputerSoft pg;
//雇用员工...
public void setPG(ComputerSoft PG) {
this.pg = PG;
}
//开干..
public String programing(int money, String needs) {
money = money - 2000;
String sourcecode =pg.programing(money, needs);
return sourcecode;
}

}
在这个类中使用接口类型,是不是不妥啊,假如饿哦写测试类
public class Test {
public static void main(String[] args) {
ProjectManager p = new ProjectManager();
p.setPG(new ProjectManager());
p.programing(20000, "sd");
}
}
将会如何? 30 楼 iaimstar 2009-08-24 你这个问题,我以前想过,后来吐血了 就不想了 31 楼 ycysth 2009-09-04 ProjectManager应该组合CodingWorker才是代理?这个是装饰?晕了。。。 32 楼 zxmsdyz 2009-09-14 怎么看都像是装饰模式,有没有人能一针见血的说出装饰和代理的区别啊,最好给个例子代码 33 楼 iaimstar 2009-09-14 zxmsdyz 写道怎么看都像是装饰模式,有没有人能一针见血的说出装饰和代理的区别啊,最好给个例子代码
代码上,没有啥区别

代理不改变功能,增强了控制,因为不想让客户端直接操作目标类,试图保证客户端面对的总是代理,客户是无法直接访问的

装饰可以增加功能,比如让一段文字--》有段落txt--》有格式的word---》有组织的excel--》有互动的--》html
对于客户端,不论文字 word excel html,都是客户的选择,是可以被访问的,包装成什么样子,客户决定

本质都是在一个方法执行之前或之后,增加其他的逻辑

简单的说,代理就是格林达姆娘,装饰就是暴风影音娘 34 楼 zxmsdyz 2009-09-15 iaimstar 写道zxmsdyz 写道怎么看都像是装饰模式,有没有人能一针见血的说出装饰和代理的区别啊,最好给个例子代码
代码上,没有啥区别

代理不改变功能,增强了控制,因为不想让客户端直接操作目标类,试图保证客户端面对的总是代理,客户是无法直接访问的

装饰可以增加功能,比如让一段文字--》有段落txt--》有格式的word---》有组织的excel--》有互动的--》html
对于客户端,不论文字 word excel html,都是客户的选择,是可以被访问的,包装成什么样子,客户决定

本质都是在一个方法执行之前或之后,增加其他的逻辑

简单的说,代理就是格林达姆娘,装饰就是暴风影音娘
这回答很好,这下就比较清楚了,多谢啦,呵呵 35 楼 lishuaibt 2009-09-21 这种类比确实很直观,但是我觉得用这种现实的眼光看待问题 不利于理解问题的本质。相对来说,因为真正的编码,多数都是建立在很抽象的环境中的,是吧!没有这么贴切,也就导致真正用的时候不知道怎么用了,说的时候倒是很清楚。问题在哪儿呢?我们太习惯于用实际的问题去理解抽象的原理了,这样并没有错,而是我们少做了一步:再次抽象,提取问题的本质!个人对模式的理解可能比较片面。。。各位大侠指正啊

读书人网 >软件架构设计

热点推荐