装饰器模式和代理模式的区别

本贴最后更新于 2356 天前,其中的信息可能已经水流花落

装饰器模式

装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下:
装饰器图片

代码实现

  public interface Sourceable {  
      public void method();  
  }
  public class Source implements Sourceable {  
    
      @Override  
      public void method() {  
          System.out.println("the original method!");  
      }  
  }

  public class Decorator implements Sourceable {  
    
      private Sourceable source;  
        
      public Decorator(Sourceable source){  
          super();  
          this.source = source;  
      }  
      @Override  
      public void method() {  
          System.out.println("before decorator!");  
          source.method();  
          System.out.println("after decorator!");  
      }  
  }
  public class DecoratorTest {  
    
      public static void main(String[] args) {  
          Sourceable source = new Source();  
          Sourceable obj = new Decorator(source);  
          obj.method();  
      }  
  }  
  

结果:

before decorator!
the original method!
after decorator!

代理模式

代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。再如我们有的时候打官司,我们需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们的想法。先来看看关系图:
代理模式图

代码实现

  public interface Sourceable {  
      public void method();  
  }  
  
  public class Source implements Sourceable {  
    
      @Override  
      public void method() {  
          System.out.println("the original method!");  
      }  
  }  
  
  public class Proxy implements Sourceable {  
    
      private Source source;  
      public Proxy(){  
          super();  
          this.source = new Source();  
      }  
      @Override  
      public void method() {  
          before();  
          source.method();  
          atfer();  
      }  
      private void atfer() {  
          System.out.println("after proxy!");  
      }  
      private void before() {  
          System.out.println("before proxy!");  
      }  
   }
   
  public class ProxyTest {  
    
      public static void main(String[] args) {  
          Sourceable source = new Proxy();  
          source.method();  
      }  
    
  }

结果

before proxy!
the original method!
after proxy!

区别

装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。

  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    198 引用 • 120 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...