A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Synaric 中级黑马   /  2015-9-30 08:33  /  487 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

关于设计模式,我自己也没怎么搞明白,根据书写了个例子,说说我的理解
  1. //类库代码(即别人写的,不可修改)
  2. class WaveForm{
  3.         private static long counter;
  4.         private final long id = counter++;
  5.         public String toString(){
  6.                 return "WaveForm id: " + id;
  7.         }
  8. }

  9. //类库代码,处理WaveForm
  10. class Fliter{
  11.         public String name(){
  12.                 return getClass().getSimpleName();
  13.         }
  14.        
  15.         //和我们的接口微妙不同
  16.         public WaveForm process(WaveForm input){
  17.                 return input;
  18.         }
  19. }

  20. //很遗憾BOSS告诉你我们的代码必须遵照这个接口
  21. interface Processor {
  22.         String name();
  23.         Object process(Object obj);
  24. }

  25. //Fliter是别人写的,我们无法修改,所以使用适配器
  26. //适配器,将Fliter接口适配
  27. class FliterAdapter implements Processor{
  28.         //持有一个fliter
  29.         private Fliter fliter;
  30.        
  31.         private int count;
  32.        
  33.         public FliterAdapter(Fliter fliter) {
  34.                 this.fliter = fliter;
  35.         }
  36.        
  37.         @Override
  38.         public String name() {
  39.                 return fliter.name();
  40.         }
  41.        
  42.         @Override
  43.         public Object process(Object obj) {
  44.                 //我们可以统计fliter.process被调用次数
  45.                 ++count;
  46.                 System.out.println("fliter.process count: " + count);
  47.                 //现在接口终于匹配了
  48.                 return fliter.process((WaveForm)obj);
  49.         }
  50. }

  51. public class Apply{
  52.         public static void process(Processor p, Object obj){
  53.                 System.out.println("Process: " + p.name());
  54.                 System.out.println(p.process(obj));
  55.         }
  56.        
  57.         public static void main(String[] args) {
  58.                 process(new FliterAdapter(new Fliter()), new WaveForm());
  59.         }
  60. }
复制代码
    适配器模式和代理模式写法差不多。在这个例子,是适配器和代理混用。不过,区别还是有的:
        适配器模式:它的主要意图是将接口A适配到接口B上,也就是解决借口不匹配。
        代理模式:它的主要意图是分离代码。通常,代理类(proxy)会实现和被代理对象相同的接口。代理还可以做一些额外的事情(比如统计代理对象的某个方法被调用次数、或者进行安全检查)。

1 个回复

倒序浏览
不错!学习了!加油!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马