浅谈设计模式之------装饰者模式

    首先给出装饰者模式的定义吧:
             动态的将责任附加到对象上,若是要扩展功能,装饰者提供了比继承更加具有弹性的替代方案。
    其中,装饰者模式秉承着一个原则:对外扩展开放,对修改关闭。、
    下面以一个例子为实例来加强对此模式的理解
     以下是星巴克咖啡生产咖啡为例,定义一个Beverage abstract class 用于表示饮料的总称,里面包括两个方法getDescription()、cost()。定义一个装饰组件CondimentDecorate CoComponent,其主要是用来调料装饰的。其继承Beverage抽象类。定义四中咖啡类型:DarkRoast、Decaf、Espresso、HouseBlend。四个装饰调料对象:Milk、Mocha、Soy、Whip。其中调料组件和具体的调料组件具有相同的超类属性。我们可以在类动态的运行的时候再根据客户的需求加入相应的调料,从而可以生产各种各样的咖啡饮料。
    以下是具体代码实现:
package com.clark.decoratepattern.abstractclass;
/**
 * 定义一个饮料抽象类
 * @author Administrator
 *
 */
public abstract  class Beverage {
    public String description="Unknown Beverage";
    public String getDescription(){
        return description;
    }
    public abstract double cost();
}

package com.clark.decoratepattern.abstractclass;
/**
 * 调料抽象类,用于装饰饮料
 * 其应该和被装饰的类具有相同的超类
 * @author Administrator
 * 所有的装饰者类也即调料者都必须重新实现getDescription()方法
 */
public abstract class CondimentDecorate extends Beverage {
    public abstract String getDescription();
}

package com.clark.decoratepattern;

import com.clark.decoratepattern.abstractclass.Beverage;
/**
 * 综合咖啡类
 * @author Administrator
 *
 */
public class HouseBlend extends Beverage {

public double cost() {
        return 0.89;
    }
    public HouseBlend(){
        description="House Blend Coffee";
    }
}
package com.clark.decoratepattern;

import com.clark.decoratepattern.abstractclass.Beverage;
/**
 * 浓缩咖啡类
 * @author Administrator
 *
 */
public class Espresso extends Beverage {
    //属性继承自父类
    public Espresso(){
        description="Espresso";
    }
    public double cost() {
        return 1.99;
    }

}
package com.clark.decoratepattern;

import com.clark.decoratepattern.abstractclass.Beverage;
/**
 * 低咖啡因
 * @author Administrator
 *
 */
public class Decaf extends Beverage {

public double cost() {
        return 1.05;
    }
    public Decaf(){
        description="decaf";
    }
}
package com.clark.decoratepattern;

import com.clark.decoratepattern.abstractclass.Beverage;
/**
 * 深度烘焙咖啡
 * @author Administrator
 *
 */
public class DarkRoast extends Beverage{
    
    @Override
    public double cost() {
        return 0.99;
    }
    public DarkRoast(){
        description="dark roast coffee";
    }
}
package com.clark.decoratepattern.decorate;

import com.clark.decoratepattern.abstractclass.Beverage;
import com.clark.decoratepattern.abstractclass.CondimentDecorate;
/**
 * 奶泡Whip调料装饰对象
 * @author Administrator
 *
 */
public class Milk extends CondimentDecorate {
    Beverage beverage;
    public Milk(Beverage beverage){
        this.beverage=beverage;
    }
    @Override
    public String getDescription() {
        return this.beverage.getDescription()+",Milk";
    }

@Override
    public double cost() {
        return this.beverage.cost()+0.10;
    }

}

package com.clark.decoratepattern.decorate;

import com.clark.decoratepattern.abstractclass.Beverage;
import com.clark.decoratepattern.abstractclass.CondimentDecorate;
/**
 * 摩卡装饰调料类
 * @author Administrator
 *
 */
public class Mocha extends CondimentDecorate {
    Beverage beverage;
    public Mocha(Beverage beverage){
        this.beverage=beverage;
    }
    //返回装饰调料的同时把其它的调料也描述
    public String getDescription() {
        return this.beverage.getDescription()+",Mocha";
    }
    //返回增加Mocha后的调料总价格
    public double cost() {
        return 0.20+this.beverage.cost();
    }

}

package com.clark.decoratepattern.decorate;

import com.clark.decoratepattern.abstractclass.Beverage;
import com.clark.decoratepattern.abstractclass.CondimentDecorate;
/**
 * 豆浆Soy调料的装饰
 * @author Administrator
 *
 */
public class Soy extends CondimentDecorate {
    Beverage beverage;
    public Soy(Beverage beverage) {
        this.beverage=beverage;
    }
    @Override
    public String getDescription() {
        return this.beverage.getDescription()+",Soy";
    }

@Override
    public double cost() {
        return this.beverage.cost()+0.15;
    }

}
package com.clark.decoratepattern.decorate;

import com.clark.decoratepattern.abstractclass.Beverage;
import com.clark.decoratepattern.abstractclass.CondimentDecorate;
/**
 * 奶泡Whip调料装饰对象
 * @author Administrator
 *
 */
public class Whip extends CondimentDecorate {
    Beverage beverage;
    public Whip(Beverage beverage){
        this.beverage=beverage;
    }
    @Override
    public String getDescription() {
        return this.beverage.getDescription()+",Whip";
    }

@Override
    public double cost() {
        return this.beverage.cost()+0.10;
    }

}

以下是测试类:即可以根据客户的需求来生产咖啡

package com.clark.decoratepattern;

import com.clark.decoratepattern.abstractclass.Beverage;
import com.clark.decoratepattern.decorate.Milk;
import com.clark.decoratepattern.decorate.Mocha;
import com.clark.decoratepattern.decorate.Soy;
import com.clark.decoratepattern.decorate.Whip;

/**
 * Test class
 * @author Administrator
 *
 */
public class Test {
    public static void main(String[] args) {
        //来一杯浓缩咖啡,之家牛奶Milk
        Beverage bev=new Espresso();
        bev=new Milk(bev);
        System.out.println(bev.getDescription()+" $"+bev.cost());
        //来一杯深陪咖啡,加牛奶和摩卡
        Beverage bev2=new DarkRoast();
        bev2=new Milk(bev2);
        bev2=new Mocha(bev2);
        System.out.println(bev2.getDescription()+" $"+bev2.cost());
        //来一杯低咖啡因,内加牛奶、摩卡、奶泡
        Beverage bev3=new HouseBlend();
        bev3=new Milk(bev3);
        bev3=new Mocha(bev3);
        bev3=new Whip(bev3);
        System.out.println(bev3.getDescription()+" $"+bev3.cost());
        //来一杯综合的咖啡,内部加奶牛、摩卡、奶泡、豆浆
        Beverage bev4=new Decaf();
        bev4=new Milk(bev4);
        bev4=new Mocha(bev4);
        bev4=new Whip(bev4);
        bev4=new Soy(bev4);
        System.out.println(bev4.getDescription()+" $"+bev4.cost());
    }
}

head first-----decorate design pattern的更多相关文章

  1. python singleton design pattern super() 多继承

    python  singleton design pattern decorate baseclass metaclass import module super() 一.A decorator de ...

  2. 说说设计模式~大话目录(Design Pattern)

    回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...

  3. 设计模式(Design Pattern)系列之.NET专题

    最近,不是特别忙,重新翻了下设计模式,特地在此记录一下.会不定期更新本系列专题文章. 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用 ...

  4. [转]Design Pattern Interview Questions - Part 4

    Bridge Pattern, Composite Pattern, Decorator Pattern, Facade Pattern, COR Pattern, Proxy Pattern, te ...

  5. [转]Design Pattern Interview Questions - Part 2

    Interpeter , Iterator , Mediator , Memento and Observer design patterns. (I) what is Interpreter pat ...

  6. [转]Design Pattern Interview Questions - Part 3

    State, Stratergy, Visitor Adapter and fly weight design pattern from interview perspective. (I) Can ...

  7. [转]Design Pattern Interview Questions - Part 1

    Factory, Abstract factory, prototype pattern (B) What are design patterns? (A) Can you explain facto ...

  8. design pattern

    1. visitor design pattern http://butunclebob.com/ArticleS.UncleBob.IuseVisitor

  9. Design Pattern: Observer Pattern

    1. Brief 一直对Observer Pattern和Pub/Sub Pattern有所混淆,下面打算通过这两篇Blog来梳理这两种模式.若有纰漏请大家指正. 2. Use Case 首先我们来面 ...

  10. Scalaz(10)- Monad:就是一种函数式编程模式-a design pattern

    Monad typeclass不是一种类型,而是一种程序设计模式(design pattern),是泛函编程中最重要的编程概念,因而很多行内人把FP又称为Monadic Programming.这其中 ...

随机推荐

  1. 笔记一:Python的PyDev插件在eclipse上面安装(新的插件地址 location)

    注:部分内容参考网上的,若有侵权,请作者联系我,马上进行删改 安装PyDev: 首先需要去Eclipse官网下载:http://www.eclipse.org/,Eclipse需要JDK支持,如果Ec ...

  2. Centos6.5安装

    前奏:CentOS 6.5下载地址http://mirror.centos.org/centos/6.5/isos/x86_64/CentOS-6.5-x86_64-bin-DVD1to2.torre ...

  3. HMM模型

    通过前几时断续的学习,发现自己对HMM模型的了解还只停留在皮毛,导致在学习CRF模型并将其与最大熵模型.HMM.MEMM做比较时感觉很吃力,所以又花了两天时间使劲看了遍HMM,发现了解得确实深刻了很多 ...

  4. java 正则操作之获取

    // 正则操作 获取import java.util.regex.*;class Demo{ public static void main(String[] args){  String str=& ...

  5. C语言的编译过程和GCC编译参数

    C语言的编译一般有三个步骤: 预编译: gcc -E -o a.e a.c 预编译a.c文件,生成的目标文件名为a.e 预编译就是将include包含的头文件内容替换到C文件中,同时删除代码中没用的注 ...

  6. Opencv实现的简易绘图工具

    第一次写博,还是个菜鸟.最近开始学习Opencv,试着写了个简易的绘图工具(目前只写了画线和橡皮擦部分,画其它图形还有待往里添加),也算是记录自己的学习之路. #include "stdaf ...

  7. EF自动生成的(T4模板) 关联属性元数据修改

    为了实现 T4模板关联属性 不要序列化的问题 就是要在具体的 关联属性上面添加一个元数据 这里利用以前的 Newtonsoft.Json 这个框架为例 效果应该为 就是要在关联属性上面添加元数据  [ ...

  8. iOS:实现表格填充和选择操作

    功能:创建一个列表,用数组填充表格,并支持选择列表行 // // main.m // Hello // // Created by lishujun on 14-8-28. // Copyright ...

  9. GHOST还原

    整理日: 2015年2月16日 GHOST GHO2Disk STEP01 STEP02 STEP03 STEP04 STEP05 STEP06 STEP07

  10. Android 如何自定义EditText 下划线?

    项目要求: 笔者曾经做过一个项目,其中登录界面的交互令人印象深刻.交互设计师给出了一个非常作的设计,要求做出包含根据情况可变色的下划线,左侧有可变图标,右侧有可变删除标志的输入框,如图 记录制作过程: ...