`
francis.xjl
  • 浏览: 16118 次
  • 性别: 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页就有概述

代理模式是对访问的控制

策略模式是对算法的封装

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

相关推荐

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

    NULL 博文链接:https://gaojiewyh.iteye.com/blog/430429

    js策略模式和代理模式

    javascript的策略模式和代理模式简介,附代码

    策略模式和代理模式.docx

    策略模式和代理模式,这两个模式设计上有点类似,但应用场景却不一样,容易混淆,所以放在一起讲,便于比较。

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

    用幽默的方式写下这些设计模式,代码里面有相应注解,不会很难理解,每个包里面有1-2个代码事例,还有一点小说明,还有本人qq,现在只有5种,其他的设计模式期待下一个版本吧!

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

    里面包括组合模式、外观模式、代理模式、观察者模式、策略模式等设计模式

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

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

    java 23种设计模式.zip

    设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象...4.行为型模式:模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。

    Java 经典设计模式讲解以及项目实战

    3 策略模式 4 模板方法模式 5 工厂方法模式 6 抽象工厂模式 7 建造者模式 8 代理模式 9 装饰模式 10 原型模式 11 委派模式 12 适配器模式 设计模式综合运用 1 门面+模版方法+责任链+策略 2 门面+模版方法+责任链+...

    设计模式-C++

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

    《Java设计模式》详解

    内容包括统一建模语言基础知识、面向对象设计原则、设计模式概述、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式、适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、...

    基于Java实现的23种设计模式Demo,抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式等

    抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式、桥接模式、组合模式、装饰模式、享元模式、代理模式、命令模式、解释器模式、访问者模式、迭代子模式、中介者模式、备忘录模式、...

    unity-23种常见设计模式unity版

    结构型模式:共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式:共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

    23种设计模式项目实例

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

    精品源码 C# 27种设计模式源代码

    3 策略模式 3 工厂方法模式 3 组合模式 4 抽象工厂模式 4 代理模式 4 命令模式 5 迭代器模式 5 适配器模式 5 原型模式 6 简单工厂模式 6 解释器模式 6 享元模式 7 桥接模式 7 状态模式 8 结构型模式总结 8 责任链...

    java常用23中设计模式

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

    《Java设计模式》电子课件01至21章(程细柱PDF)

    内容包括统一建模语言基础知识、面向对象设计原则、设计模式概述、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式、适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、...

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

    主要介绍23种设计模式,以及个别设计模式的区别,文章查看地址:https://blog.csdn.net/wangjz2008/article/details/115203884

    java设计模式

    12.3.1 代理模式的优点 12.3.2 代理模式的应用 12.4 代理模式的扩展 12.4.1 普通代理 12.4.2 强制代理 12.4.3 代理是有个性的 12.4.4 虚拟代理 12.4.5 动态代理 12.5 最佳实践 第13章 原型模式 13.1 个性化电子账单 ...

    lua设计模式总结

    2、代理模式lua实现 3、外观模式lua实现 4、适配器模式lua实现 5、组合模式lua实现 6、桥接模式lua实现 7、享元模式lua实现 行为模式 1、策略模式lua实现 2、模板方法模式lua实现 3、观察者模式lua实现 4、状态模式...

Global site tag (gtag.js) - Google Analytics