观察者模式-装饰者模式

原创 2018年04月17日 20:25:13
装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
  1. 继承属于扩展形式之一,但不见得达到弹性涉及的最佳方式。
  2. 在我们的设计中,应该允许行为可以被扩展,而无需修改现有的代码。
  3. 组合和委托可用于在运行时动态地加上新的行为。
  4. 除了继承,装饰者模式也可以让我们扩展行为。
  5. 装饰者模式意味着一群装饰者类,这些类用来包装具体组件。
  6. 装饰者类反映出被装饰者的组件类型(事实上,他们具有相同的类型,都经过接口或继承实现)
  7. 装饰者可以在被装饰者的行为前面与/或者后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的。
  8. 你可以用无数个装饰者包装一个组件。
  9. 装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型。
  10. 装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得复杂。
  11. 装饰者和被装饰者对象有相同的超类型。
  12. 你可以用一个或多个装饰者包装一个对象。
  13. 既然装饰者和被装饰者有相同的超类型,所以在任何需要原始对象(被包装)的场合,可以用装饰过的对象代替它。
  14. 装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
  15. 对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。

public abstract class Beverage {
    String description = "Unknown Beverage";
    public String getDescription(){
        return description;
    }
    public abstract double cost();
}
public abstract class CondimentDecorator extends Beverage {
    public abstract String getDescription();
}
public class Mocha extends CondimentDecorator{

    Beverage beverage;

    public Mocha(Beverage beverage) {
        this.beverage = beverage;
    }

    public String getDescription() {
        return beverage.getDescription()+",Mocha";
    }

    public double cost() {
        return 0.20+beverage.cost();
    }
}

public class HouseBlend extends Beverage{
    public HouseBlend() {
        description = "House Blend Coffee";
    }
    public double cost() {
        return 0.89;
    }
}
public class Espresso extends Beverage{
    public double cost() {
        return 1.99;
    }
    public Espresso() {
        description = "Espresso";
    }
}
public class Ch3Test {
    public static void main(String[] args) {
        Beverage beverage = new Espresso();
        System.out.println(beverage.getDescription()+" $ "+beverage.cost());
        Beverage beverage1 = new HouseBlend();
        beverage1 = new Mocha(beverage1);
        beverage1 = new Mocha(beverage1);
        System.out.println(beverage1.getDescription()+" $ "+beverage1.cost());
    }
}




版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011077966/article/details/79980093

设计模式(一) 观察者模式、装饰模式、工厂模式

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ---------------------- 1.观察者模式     观察...
  • yangmiao1015
  • yangmiao1015
  • 2013-12-07 16:50:02
  • 920

关于复合模式、策略模式,工厂模式、观察者模式、装饰模式的一个好例子

原帖地址:http://chat.javaeye.com/blog/178414 我们将再次使用鸭子的例子来说明并学习,下一章我们会拜访一个真正的复合模式--MVC,没错,就是MVC.1.首先,我们将...
  • buptisc_txy
  • buptisc_txy
  • 2010-04-21 23:10:00
  • 1331

策略模式+观察者模式+装饰者模式

策略模式: 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 eg:鸭子模型 要点: 1.知道OO基础,并不足以让...
  • qq_37882286
  • qq_37882286
  • 2017-09-07 16:41:49
  • 102

设计模式(七)装饰者和观察者模式

观察者模式 观察者模式完美的将观察者和被观察对象分开,系统中的每个类将重点放在某一个功能上,而不是其他的方面(对象之间的交互),很好的体现了单一职责原则。观察者将自己注册到被观察者的容器中,被观察者...
  • ysu108
  • ysu108
  • 2012-09-11 19:47:32
  • 1127

设计模式之代理模式和装饰者模式的区别(java)

为了能让自己写出更优美的代码,最近开始学习设计模式方面的知识。之前只在项目中简单的使用过单例模式和观察者模式,对于其他的几种(据说有23种)设计模式都有些混淆不清。以后一定要把每一种的梳理清楚。   ...
  • Sapphire_LLL
  • Sapphire_LLL
  • 2017-01-05 13:40:19
  • 294

设计模式——单例模式、工厂模式、代理模式、观察者模式、装饰器模式

设计模式是一种解决方案,用于解决在软件设计中普遍存在的问题,是前辈们对之前软件设计中反复出现的问题的一个总结。 至于我们为什么要学习设计模式,我觉得轮子哥总结的很好 我们学设计模式,是为了学习如...
  • learrrrrrrrn
  • learrrrrrrrn
  • 2017-03-26 16:55:17
  • 1945

开发模式demo

  • 2018年01月05日 17:27
  • 36KB
  • 下载

HeadFirst源代码

  • 2015年04月28日 09:05
  • 880KB
  • 下载

云大版(Java)设计模式实验

  • 2011年06月13日 16:56
  • 1.66MB
  • 下载

设计模式demo

  • 2015年05月31日 10:29
  • 136KB
  • 下载
收藏助手
不良信息举报
您举报文章:观察者模式-装饰者模式
举报原因:
原因补充:

(最多只允许输入30个字)