2007-07-19

(5) 结构模式之 Proxy 模式

关键字: patterns, 模式

 

Y先生最近的活动特别多,什么出差了,和朋友一起吃饭啦,等等。所以,他经常从家里拿钱。

Q女士过了一段时间发现,家里的钱进出得非常快,她决定和Y先生谈一谈。

Q女士:老公,咱家的钱最近进出特别频繁,要不我们记账怎么样?

Y先生:好啊,我早就有这个想法了。可是我们怎么做呢?

Q女士:嗯,让我想一下,看下面的:

java 代码
  1. public interface IAccount {   
  2.        
  3.     public void recordSaveMoney(double money);   
  4.     public void recordCostMoney(double money);   
  5.        
  6. }  

Y先生:嗯,我们先定义了一个接口。我知道该怎么做了!

java 代码
  1. public class ManageAccount implements IAccount {   
  2.   
  3.     public void recordSaveMoney(double money) {   
  4.         // TODO Auto-generated method stub   
  5.   
  6.     }   
  7.   
  8.     public void recordCostMoney(double money) {   
  9.         // TODO Auto-generated method stub   
  10.   
  11.     }   
  12.   
  13. }  

Q女士:嗯,你变得越来越聪明了!

Y先生:可是,老婆,即使这样,如果我取钱的时候,也可能会忘记调用这个东西来记账的。

Q女士:嗯,你说的这个确实是个问题。。。不过这样的问题难不倒我。。。之前我们取钱,存钱用的是下面的方式吧:

java 代码
  1. public interface IHomeMoney {   
  2.        
  3.     public void getMoney(double money);   
  4.     public void saveMoney(double money);   
  5.        
  6. }  
java 代码
  1. public class SampleHomeMoney implements IHomeMoney {   
  2.   
  3.     public void getMoney(double money) {   
  4.         // TODO Auto-generated method stub   
  5.   
  6.     }   
  7.   
  8.     public void saveMoney(double money) {   
  9.         // TODO Auto-generated method stub   
  10.   
  11.     }   
  12.   
  13. }  

Y先生:嗯,上面这个是用来取钱,存钱用的,可是这有什么用呢?我仍然有可能忘记去记账。

Q女士:别急,看我下面的做法:

java 代码
  1. public class ManageAccount implements IHomeMoney {   
  2.        
  3.     private IHomeMoney homeMoney;   
  4.        
  5.     public ManageAccount(IHomeMoney homeMoney) {   
  6.         // TODO Auto-generated constructor stub   
  7.         this.homeMoney = homeMoney;   
  8.     }   
  9.        
  10.     private void recordSaveMoney(double money) {   
  11.         // TODO Auto-generated method stub   
  12.   
  13.     }   
  14.   
  15.     private void recordCostMoney(double money) {   
  16.         // TODO Auto-generated method stub   
  17.   
  18.     }   
  19.   
  20.     public void getMoney(double money) {   
  21.         // TODO Auto-generated method stub   
  22.         recordCostMoney(money);   
  23.         homeMoney.getMoney(money);   
  24.            
  25.     }   
  26.   
  27.     public void saveMoney(double money) {   
  28.         // TODO Auto-generated method stub   
  29.            
  30.         recordSaveMoney(money);   
  31.         homeMoney.saveMoney(money);   
  32.            
  33.     }   
  34.        
  35. }  

Y先生:恩,我明白了,我用如下的方式取钱,存钱就可以了:

java 代码
  1. public static void main(String[] args) {   
  2.        
  3.     IHomeMoney homeMoney = new ManageAccount(   
  4.                     new SampleHomeMoney());   
  5.     homeMoney.saveMoney(100);   
  6.     homeMoney.getMoney(100);   
  7.        
  8. }  

Q女士:嗯,不错!这个 ManageAccount 就好像一个代理,你以后就通过这个类来取钱,存钱吧!
              恩,,,其实这个名字叫  HomeMoneyProxy 或许更好!

Y先生:好的,这样我也不必修改取钱,存钱的接口了!可是,我有一个问题,你刚才使用的那个 IAccount 好像没用了?

Q女士:当然了!有些需求,只有到实际的阶段才会发展成更好的设计!“源代码就是设计”听过没?

Y先生一边擦汗一边说:没有、、我这就去学习学习.

 

评论
守望者 2007-07-23
写得不错!~期待ing.............
发表评论

您还没有登录,请登录后发表评论

yananay
搜索本博客
我的相册
D35bafa8-5bf0-475f-aa06-16f3080557a1-thumb
tdd
共 3 张
存档
最新评论