`
tomorrow009
  • 浏览: 45753 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

代理模式(Proxy)与装饰模式(Adapter)

阅读更多

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

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

实际编码中的例子呢, 比如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, 我保证这是最后一句啰嗦:
所谓模式,其实就是最佳实践的总结. 所以要学透模式,一定要联系现实生活,先弄清楚什么情况下需要使用这个模式,否则凭空想象的话,很容易混淆不说,还抓不住精要.  
分享到:
评论

相关推荐

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    2、代理模式PROXY PATTERN 3、单例模式SINGLETON PATTERN 4、多例模式MULTITION PATTERN 5、工厂方法模式FACTORY METHOD PATTERN 6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式FACADE PATTERN 8、适配器...

    java设计模式教程+源代码

    Proxy ( 代理模式 ) Chain of Responsibility ( 责任链模式 ) Command ( 命令模式 ) Interpreter ( 解释器模式 ) Iterator ( 迭代器模式 ) Mediator ( 中介者模式 ) Memento ( 备忘录模式 ) Observer ( 观察...

    C#版 24种设计模式

    备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) 单例模式(Singleton Pattern) 迭代器模式(Iterator Pattern) 访问者模式(Visitor ...

    C#设计模式_设计模式_C#_

    代理模式(Proxy Pattern) 行为型: 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 16. 观察者模式(Observer Pattern) 17. 解释器模式(Interpreter Pattern) 18....

    24种设计模式以及混合设计模式

    其中包括代理模式(Proxy)、装饰器模式(Decorator)、适配器模式(Adapter)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)和享元模式(Flyweight)。这些模式帮助我们在不修改原有代码的情况...

    C++设计模式(Design Pattern)范例源代码

    代理模式(Proxy) 行为型: 责任链模式(Chain of Responsibility) 命令模式(Command) 解释器模式(Interpreter) 迭代器模式(Iterator) 中介者模式(Mediator) 备忘录模式(Memento) 观察者模式(Observer) 状态模式...

    用Java实现23种设计模式

    代理模式(Proxy Pattern) 3. 行为型模式 责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式(Interpreter Pattern) 迭代器模式(Iterator Pattern) 中介者模式...

    java版本二十三种设计模式.zip

    - 代理模式(Proxy) - 适配器模式(Adapter) - 装饰器模式(Decorator) - 桥接模式(Bridge) - 组合模式(Composite) - 外观模式(Facade) - 享元模式(Flyweight) - 观察者模式(Observer) - 模板方法模式...

    01-制造工具的工厂模式(1).html

    代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( Template Method ) 观察者模式( ...

    09-通过容器实现的外观模式(2).html

    代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( Template Method ) 观察者模式( ...

    23种java设计模式.pdf

    结构模式是指在对象之间的关系和结构上使用的模式,包括 Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade(外观模式)...

    00-初探 Laravel 和其中的设计模式(3).html

    代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( Template Method ) 观察者模式( ...

    c#设计模式

    2. 结构型模式:这些模式处理对象组合和结构,如适配器模式(Adapter)、桥接模式(Bridge)、组合模式(Composite)、装饰器模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)。...

    12-附录 1 设计模式的七大原则(1).html

    代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( Template Method ) 观察者模式( ...

    23种java设计模式

    2、结构模式:Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade (外观模式)。3、行为模式:Iterator(迭代模式)、Template(模板...

    C#经典设计模式及代码示例

    2. 结构型模式:这些模式处理类和对象的组合,如适配器模式(Adapter)、装饰器模式(Decorator)和代理模式(Proxy)。适配器模式可以将不兼容的接口转换为可用的接口,而装饰器模式允许动态地给对象添加新的行为或...

    中文版_源码设计模式解析与实战.pdf

    3. **结构型模式**:包括适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)和享元模式(Flyweight)。这些模式主要处理类和对象...

    java与模式光盘源码

    结构型模式如适配器(Adapter)、装饰器(Decorator)和代理(Proxy)等,关注如何组合对象和类,以实现新的功能或改善原有结构。行为型模式如观察者(Observer)、模板方法(Template Method)和策略(Strategy)等...

    您的设计模式.pdf。

    代理模式(PROXY PATTERN) 代理模式是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理模式可以帮助开发者控制对对象的访问,以便提高系统的安全性和性能。例如,在一个分布式系统中,...

    C#面向对象设计模式纵横谈(视频与源码)

    C#面向对象设计模式纵横谈(13):Proxy 代理模式(结构型模式) C#面向对象设计模式纵横谈(14):Chain of Responsibility 职责链模式(行为型模式) C#面向对象设计模式纵横谈(15):(行为型模式) Command 命令模式 ...

Global site tag (gtag.js) - Google Analytics