`
francis.xjl
  • 浏览: 16667 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

简单代理模式与策略模式的区别

阅读更多

看到这篇文章很受启发,http://royaki.iteye.com/blog/659895

我个人的理解是这样的:
简单代理模式与策略模式在功能上的很大的区别是:

简单代理模式中,代理类知道被代理类的行为,因为代理类与被代理类实现的是同一个接口,因此代理类与被代理类的结构是相同的;

而策略模式中,策略容器并不知道内部策略的详细信息,因为容器并没有实现与内部策略相同的接口,即容器与内部策略只是简单的组合关系,容器只是将内部策略的行为抽取出来,进行了统一的实现。
分享到:
评论
12 楼 youaretheboy 2010-05-25  
tomorrow009 写道
francis.xjl 写道
XTU_xiaoxin 写道
这两者有可比性吗?如果能给我详细描述出代理模式装饰模式的区别及各自使用场合,那才是对大家最大的帮助,了解非常透彻的兄弟说说呗

同求,我只能理解概念,不好意思~


代理模式
考虑现实生活中的代理商. 你想要进一批货,但是出于某种原因,你无法直接与生产商联系(有可能是因为你生产商与你相隔太远, 或者比如你进的货是军  火, 一般来说生产商也不会直接露面滴), 这时候你就需要一个代理商, 他能够接受你的订单, 并且也能给你需要的货品, 但是记住,代理商并不真正生产货品,他的能力在于他有办法从生产商那里给你搞到货品.

那么对于买家,也就是接口的调用者而言, 我并不关心你到底是代理商还生产商,我只要你能够跟我交易就可以. 从这角度理解的话,代理隔离了调用者和实现者直接的联系.

实际编码中的例子呢, 比如WebService的调用你就可以把他理解成一个(远程)代理.

装饰模式
语义上理解,装饰是什么呢? 装饰就是在原本的东西上添油加醋嘛. 装饰的原则就是,对于一个西瓜, 不管我怎么装饰,它始终都是一个西瓜, 我不能最终把它装饰一番之后当成土豆去卖.

举个例子,大家应该都买过那种现做的冰淇淋. 一般都是这样卖的, 普通的冰淇淋必选,上面可以加上各种葡萄干啊,榛子啊,蓝莓酱啊之类的,当然每加一样你就要多交一点钱啦:). 那针对这个给冰淇淋算价钱的问题, 写成代码呢, 差不多就是这样子的.
//抽象冰淇淋
abstract class AbstractIceCream{
  public abstract int getPrice(); 
}

//真正的冰淇淋
class IceCream extends AbstractIceCream{
  
  public int getPrice(){
    return 2;     //原味冰淇淋只卖5块~~
  }
}
//冰淇淋的巧克力装饰器
class ChocolateAdapter extends AbstractIceCream {
  private AbstractIceCream iceCream;     //to be adapted.
  public ChocolateAdapter(AbstractIceCream iceCream){
      this.iceCream = iceCream
  }
  public getPrice (){
      return this.iceCream.getPrice()+3; //假设加一层巧克力要加3块钱好了~
  }
}
//冰淇淋的蓝莓酱装饰器
class BlueberryAdapter extends AbstractIceCream {
  private AbstractIceCream iceCream;     //to be adapted.
  public BlueberryAdapter(AbstractIceCream iceCream){
      this.iceCream = iceCream
  }
  public getPrice (){
      return this.iceCream.getPrice()+5; //假设加一层蓝莓酱要加5块钱好了~
  }
}

//顾客来了
public class Client{
   public static void main(String args[]){
   //给我来个蓝莓冰淇淋   
   AbstractIceCream blueberryIceCream = new BlueberryAdapter(new IceCream());
   
   //给我来个蓝莓巧克力冰淇淋~~
   AbstractIceCream bb_ch_iceCream = new BlueberryAdapter(new ChocolateAdapter(new IceCream()));

   //来了一个巧克力超级粉丝说,我要加3层巧克力~~
   AbstractIceCream lot_of_chocolate_iceCream = new ChocolateAdapter(new ChocolateAdapter(new ChocolateAdapter(new IceCream())))    

   //然后算帐看看,你猜这些冰淇淋分别要多少钱呢...
   println(blueberryIceCream.getPrice());
   println(bb_ch_iceCream.getPrice());
   println(lot_of_chocolate_iceCream.getPrice());

   }
}


写成这样我想大家应该能理解了? 再啰嗦两句,装饰器模式实际上在一定程度上解决了一个问题, 那就是类继承的局限性,类爆炸. 像上面的例子中,用最原始的集成方案的话,大概需要一下几个类: 冰淇淋, 巧克力的冰淇淋, 草莓的冰淇淋, 巧克力和草莓都有的冰淇淋...貌似还可以接受,但由于这些辅料是可以随意组合的, 那么比如我又新添了一个辅料香草,那我就又要新增 N个子类..., 学过组合数学的同学就会知道, 其实没学的也知道, 这样一来子类的生长速度可是相当客观的. 而使用装饰器的话, 新增一个辅料,我只需新增一个装饰器类即可, 省心啊...看起来程序员的生活又美好了不是么?  

ok, 我保证这是最后一句啰嗦:
所谓模式,其实就是最佳实践的总结. 所以要学透模式,一定要联系现实生活,先弄清楚什么情况下需要使用这个模式,否则凭空想象的话,很容易混淆不说,还抓不住精要.  


说得太好了。。。
11 楼 francis.xjl 2010-05-25  
tomorrow009 写道
francis.xjl 写道
XTU_xiaoxin 写道
这两者有可比性吗?如果能给我详细描述出代理模式装饰模式的区别及各自使用场合,那才是对大家最大的帮助,了解非常透彻的兄弟说说呗

同求,我只能理解概念,不好意思~


代理模式
考虑现实生活中的代理商. 你想要进一批货,但是出于某种原因,你无法直接与生产商联系(有可能是因为你生产商与你相隔太远, 或者比如你进的货是军  火, 一般来说生产商也不会直接露面滴), 这时候你就需要一个代理商, 他能够接受你的订单, 并且也能给你需要的货品, 但是记住,代理商并不真正生产货品,他的能力在于他有办法从生产商那里给你搞到货品.

那么对于买家,也就是接口的调用者而言, 我并不关心你到底是代理商还生产商,我只要你能够跟我交易就可以. 从这角度理解的话,代理隔离了调用者和实现者直接的联系.

实际编码中的例子呢, 比如WebService的调用你就可以把他理解成一个(远程)代理.

装饰模式
语义上理解,装饰是什么呢? 装饰就是在原本的东西上添油加醋嘛. 装饰的原则就是,对于一个西瓜, 不管我怎么装饰,它始终都是一个西瓜, 我不能最终把它装饰一番之后当成土豆去卖.

举个例子,大家应该都买过那种现做的冰淇淋. 一般都是这样卖的, 普通的冰淇淋必选,上面可以加上各种葡萄干啊,榛子啊,蓝莓酱啊之类的,当然每加一样你就要多交一点钱啦:). 那针对这个给冰淇淋算价钱的问题, 写成代码呢, 差不多就是这样子的.
//抽象冰淇淋
abstract class AbstractIceCream{
  public abstract int getPrice(); 
}

//真正的冰淇淋
class IceCream extends AbstractIceCream{
  
  public int getPrice(){
    return 2;     //原味冰淇淋只卖5块~~
  }
}
//冰淇淋的巧克力装饰器
class ChocolateAdapter extends AbstractIceCream {
  private AbstractIceCream iceCream;     //to be adapted.
  public ChocolateAdapter(AbstractIceCream iceCream){
      this.iceCream = iceCream
  }
  public getPrice (){
      return this.iceCream.getPrice()+3; //假设加一层巧克力要加3块钱好了~
  }
}
//冰淇淋的蓝莓酱装饰器
class BlueberryAdapter extends AbstractIceCream {
  private AbstractIceCream iceCream;     //to be adapted.
  public BlueberryAdapter(AbstractIceCream iceCream){
      this.iceCream = iceCream
  }
  public getPrice (){
      return this.iceCream.getPrice()+5; //假设加一层蓝莓酱要加5块钱好了~
  }
}

//顾客来了
public class Client{
   public static void main(String args[]){
   //给我来个蓝莓冰淇淋   
   AbstractIceCream blueberryIceCream = new BlueberryAdapter(new IceCream());
   
   //给我来个蓝莓巧克力冰淇淋~~
   AbstractIceCream bb_ch_iceCream = new BlueberryAdapter(new ChocolateAdapter(new IceCream()));

   //来了一个巧克力超级粉丝说,我要加3层巧克力~~
   AbstractIceCream lot_of_chocolate_iceCream = new ChocolateAdapter(new ChocolateAdapter(new ChocolateAdapter(new IceCream())))    

   //然后算帐看看,你猜这些冰淇淋分别要多少钱呢...
   println(blueberryIceCream.getPrice());
   println(bb_ch_iceCream.getPrice());
   println(lot_of_chocolate_iceCream.getPrice());

   }
}


写成这样我想大家应该能理解了? 再啰嗦两句,装饰器模式实际上在一定程度上解决了一个问题, 那就是类继承的局限性,类爆炸. 像上面的例子中,用最原始的集成方案的话,大概需要一下几个类: 冰淇淋, 巧克力的冰淇淋, 草莓的冰淇淋, 巧克力和草莓都有的冰淇淋...貌似还可以接受,但由于这些辅料是可以随意组合的, 那么比如我又新添了一个辅料香草,那我就又要新增 N个子类..., 学过组合数学的同学就会知道, 其实没学的也知道, 这样一来子类的生长速度可是相当客观的. 而使用装饰器的话, 新增一个辅料,我只需新增一个装饰器类即可, 省心啊...看起来程序员的生活又美好了不是么?  

ok, 我保证这是最后一句啰嗦:
所谓模式,其实就是最佳实践的总结. 所以要学透模式,一定要联系现实生活,先弄清楚什么情况下需要使用这个模式,否则凭空想象的话,很容易混淆不说,还抓不住精要.  

不错,很受启发~
10 楼 tomorrow009 2010-05-25  
francis.xjl 写道
XTU_xiaoxin 写道
这两者有可比性吗?如果能给我详细描述出代理模式装饰模式的区别及各自使用场合,那才是对大家最大的帮助,了解非常透彻的兄弟说说呗

同求,我只能理解概念,不好意思~


代理模式
考虑现实生活中的代理商. 你想要进一批货,但是出于某种原因,你无法直接与生产商联系(有可能是因为你生产商与你相隔太远, 或者比如你进的货是军  火, 一般来说生产商也不会直接露面滴), 这时候你就需要一个代理商, 他能够接受你的订单, 并且也能给你需要的货品, 但是记住,代理商并不真正生产货品,他的能力在于他有办法从生产商那里给你搞到货品.

那么对于买家,也就是接口的调用者而言, 我并不关心你到底是代理商还生产商,我只要你能够跟我交易就可以. 从这角度理解的话,代理隔离了调用者和实现者直接的联系.

实际编码中的例子呢, 比如WebService的调用你就可以把他理解成一个(远程)代理.

装饰模式
语义上理解,装饰是什么呢? 装饰就是在原本的东西上添油加醋嘛. 装饰的原则就是,对于一个西瓜, 不管我怎么装饰,它始终都是一个西瓜, 我不能最终把它装饰一番之后当成土豆去卖.

举个例子,大家应该都买过那种现做的冰淇淋. 一般都是这样卖的, 普通的冰淇淋必选,上面可以加上各种葡萄干啊,榛子啊,蓝莓酱啊之类的,当然每加一样你就要多交一点钱啦:). 那针对这个给冰淇淋算价钱的问题, 写成代码呢, 差不多就是这样子的.
//抽象冰淇淋
abstract class AbstractIceCream{
  public abstract int getPrice(); 
}

//真正的冰淇淋
class IceCream extends AbstractIceCream{
  
  public int getPrice(){
    return 2;     //原味冰淇淋只卖5块~~
  }
}
//冰淇淋的巧克力装饰器
class ChocolateAdapter extends AbstractIceCream {
  private AbstractIceCream iceCream;     //to be adapted.
  public ChocolateAdapter(AbstractIceCream iceCream){
      this.iceCream = iceCream
  }
  public getPrice (){
      return this.iceCream.getPrice()+3; //假设加一层巧克力要加3块钱好了~
  }
}
//冰淇淋的蓝莓酱装饰器
class BlueberryAdapter extends AbstractIceCream {
  private AbstractIceCream iceCream;     //to be adapted.
  public BlueberryAdapter(AbstractIceCream iceCream){
      this.iceCream = iceCream
  }
  public getPrice (){
      return this.iceCream.getPrice()+5; //假设加一层蓝莓酱要加5块钱好了~
  }
}

//顾客来了
public class Client{
   public static void main(String args[]){
   //给我来个蓝莓冰淇淋   
   AbstractIceCream blueberryIceCream = new BlueberryAdapter(new IceCream());
   
   //给我来个蓝莓巧克力冰淇淋~~
   AbstractIceCream bb_ch_iceCream = new BlueberryAdapter(new ChocolateAdapter(new IceCream()));

   //来了一个巧克力超级粉丝说,我要加3层巧克力~~
   AbstractIceCream lot_of_chocolate_iceCream = new ChocolateAdapter(new ChocolateAdapter(new ChocolateAdapter(new IceCream())))    

   //然后算帐看看,你猜这些冰淇淋分别要多少钱呢...
   println(blueberryIceCream.getPrice());
   println(bb_ch_iceCream.getPrice());
   println(lot_of_chocolate_iceCream.getPrice());

   }
}


写成这样我想大家应该能理解了? 再啰嗦两句,装饰器模式实际上在一定程度上解决了一个问题, 那就是类继承的局限性,类爆炸. 像上面的例子中,用最原始的集成方案的话,大概需要一下几个类: 冰淇淋, 巧克力的冰淇淋, 草莓的冰淇淋, 巧克力和草莓都有的冰淇淋...貌似还可以接受,但由于这些辅料是可以随意组合的, 那么比如我又新添了一个辅料香草,那我就又要新增 N个子类..., 学过组合数学的同学就会知道, 其实没学的也知道, 这样一来子类的生长速度可是相当客观的. 而使用装饰器的话, 新增一个辅料,我只需新增一个装饰器类即可, 省心啊...看起来程序员的生活又美好了不是么?  

ok, 我保证这是最后一句啰嗦:
所谓模式,其实就是最佳实践的总结. 所以要学透模式,一定要联系现实生活,先弄清楚什么情况下需要使用这个模式,否则凭空想象的话,很容易混淆不说,还抓不住精要.  
9 楼 ironsabre 2010-05-25  
识别真正易变的,隔离它。这点比分清什么模式叫什么更重要。

模式主要实现就分两大类:基于继承(比如模板模式),基于组合(比如策略模式,代理,,)

还有一些简单的,基于正常人的常识,比如门面模式等。
8 楼 ironsabre 2010-05-25  
代理和装饰的实现是一样的,只是目的不相同。代理是限制,装饰是增强。

很多模式都很像的,要刻意去分清楚需要咬文嚼字。
7 楼 浪客剑心 2010-05-25  
ilove2009 写道
模式这东西,看不懂也没有关系。重要的是不要忘记oo的目标,只要我们的设计能达到oo的目标就ok了,到时候我们的设计自然往模式上靠拢。模式是达到oo目标的途径之一而已。模式是已经存在的东西,只不过是gof发现而已,不是gof发明的。

嗯  确实是,我们的目的不是为了模式而学模式,最终的目的是为了让我们的程序更加符合oo的设计原则!
6 楼 jameswxx 2010-05-25  
这两个没有可比性吧,一般都是讨论代理模式和装饰模式的区别,策略模式和模板模式的区别
5 楼 francis.xjl 2010-05-25  
XTU_xiaoxin 写道
这两者有可比性吗?如果能给我详细描述出代理模式装饰模式的区别及各自使用场合,那才是对大家最大的帮助,了解非常透彻的兄弟说说呗

同求,我只能理解概念,不好意思~
4 楼 ilove2009 2010-05-25  
模式这东西,看不懂也没有关系。重要的是不要忘记oo的目标,只要我们的设计能达到oo的目标就ok了,到时候我们的设计自然往模式上靠拢。模式是达到oo目标的途径之一而已。模式是已经存在的东西,只不过是gof发现而已,不是gof发明的。
3 楼 XTU_xiaoxin 2010-05-25  
这两者有可比性吗?如果能给我详细描述出代理模式装饰模式的区别及各自使用场合,那才是对大家最大的帮助,了解非常透彻的兄弟说说呗
2 楼 freish 2010-05-25  
这两者的意图是截然不同的吧!
1 楼 beneo 2010-05-25  
其实这种区别在GOF设计模式前10页就有概述

代理模式是对访问的控制

策略模式是对算法的封装

当然如果要完全理解还是需要时间的。

相关推荐

    简单工厂模式、代理模式、策略模式如此相似

    在软件设计模式的世界里,"简单工厂模式"、"代理模式"和"策略模式"都是经典的设计模式,它们各自有着独特的应用场景和优缺点。本文将深入解析这三种模式的原理和区别,帮助读者理解它们在实际开发中的运用。 首先,...

    js策略模式和代理模式

    策略模式和代理模式是设计模式中的两种常见模式,它们在软件开发中扮演着重要的角色,尤其是在JavaScript中,这两种模式提供了更加灵活和可维护的代码结构。 策略模式(Strategy Pattern)是一种行为设计模式,它...

    python 项目里常用的设计模式 组合模式 策略模式 抽象工厂 代理模式 工厂模式 观察者模式 简单工厂 建造者模式 模板模式

    python 项目里常用的设计模式 单例模式 组合模式 策略模式 抽象工厂 代理模式 工厂模式 观察者模式简单工厂 建造者模式 模板模式 桥接多维度 桥接模式 适配器模式 外观模式 享元模式 责任链组合模式

    策略模式和代理模式.docx

    两者的区别在于,策略模式关注的是行为的可变性,而代理模式关注的是对象的访问控制和增强。策略模式中,策略对象的选取是在运行时决定的,可以根据具体情境灵活切换;而在代理模式中,代理对象通常是为了控制对目标...

    23种设计模式之:建造者,代理,观察,策略,状态模式

    本文将重点介绍标题中提到的五种设计模式:建造者模式、代理模式、观察者模式、策略模式以及状态模式。 **1. 建造者模式(Builder)** 建造者模式是一种创建型设计模式,它允许我们分步骤构建复杂对象,而无需暴露...

    23种设计模式详细介绍与区别

    在本文中,我们将深入探讨标题提及的23种设计模式,并着重讨论桥接模式与适配器模式、装饰模式与代理模式、状态模式与策略模式,以及工厂模式之间的差异。 1. **桥接模式与适配器模式**: - **桥接模式**:将抽象...

    结构型模式之代理模式(Proxy)

    代理模式的应用场景广泛,例如在Web开发中,可以通过代理模式来实现权限控制、缓存策略、日志记录等功能。在软件设计中,代理模式可以帮助我们遵循开闭原则,即对扩展开放,对修改关闭,因为它允许我们在不改变原有...

    Spring下使用策略模式

    在Spring框架中,策略模式是一种常见的设计模式,它允许我们定义一组可互换的策略,这些策略可以在运行时根据需求动态选择。这篇文章将深入探讨如何在Spring中运用策略模式,并结合源码分析其工作原理。 策略模式的...

    网闸代理模式配置.docx

    深信服网闸代理模式配置是一项关键的安全管理任务,它涉及到网络访问控制和数据传输的安全性。网闸,全称为“安全隔离与信息交换系统”,主要用于实现不同安全等级网络之间的安全隔离,同时满足数据交换的需求。以下...

    代理模式Demo代理模式代理模式Demo

    总结来说,代理模式是一种灵活的设计策略,它允许我们在不修改原有系统的基础上,通过引入代理对象来扩展系统的功能,提高代码的可复用性和可维护性。通过理解和熟练运用代理模式,开发者能够更好地应对各种复杂的...

    cas代理模式代码示例

    在IT行业中,代理模式是一种常见的设计模式,它允许我们在不修改原有对象的基础上,为对象添加新的功能或控制访问。在本示例中,我们将重点讨论如何在Java环境下使用代理模式来实现代理逻辑,特别是在CAS(Central ...

    设计模式:简单工厂、方法工厂、抽象工厂、单例、原型、委派、模板、代理、策略

    9. **策略**:策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。策略定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换,策略让算法独立于使用它的客户。 这些设计模式都是面向对象编程...

    软件体系结构实验报告--设计模式2

    本实验报告主要探讨了五个关键的设计模式:组合模式、外观模式、代理模式、观察者模式以及策略模式,这些都是软件体系结构中的重要组成部分,对于理解和优化代码结构具有深远影响。 1. **组合模式**: 组合模式是一...

    LED照明灯具代理模式

    LED照明灯具代理模式是一种在照明行业中常见的销售渠道策略,旨在通过合作伙伴关系扩大市场覆盖面,提高品牌知名度和销售量。这种模式的核心在于寻找合适的代理商,与他们建立长期稳定的关系,共同推动LED照明灯具的...

    设计模式之_代理模式

    **代理模式**是一种常用的设计模式,它在软件开发中扮演着重要的角色,特别是在对象的访问控制、性能优化、安全策略等方面。代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象可以控制对原...

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂

    3. **代理模式**:代理模式为其他对象提供一种代理以控制对这个对象的访问。它可以用来在访问目标对象前添加额外的功能,如权限检查、日志记录或者缓存策略。Java中,静态代理和动态代理(Java Proxy API)是常见的...

    07代理模式_设计模式_

    代理模式是一种常用的设计模式,属于结构型模式,它在对象结构中引入了一个代理,以便提供对目标对象的访问控制或增强原有功能。...同时,掌握代理模式也是理解其他设计模式,如装饰器模式、策略模式等的基础。

    CAS代理模式

    1. **CAS服务器配置**:确保CAS服务器支持并启用了代理模式,配置相应的代理策略和权限。 2. **服务端集成**:在需要代理操作的服务端代码中,集成CAS客户端库,实现票证的验证和代理票证的获取。 3. **安全策略**...

    Java两种代理模式案例

    在软件设计模式中,代理模式是一种常用的设计策略,它允许我们为一个对象提供一个代理以控制对该对象的访问。在Java中,代理模式有两种主要实现方式:静态代理和动态代理。下面将详细介绍这两种代理模式,并结合`...

Global site tag (gtag.js) - Google Analytics