装饰者模式-星巴克

来源:互联网 发布:数据库主键和外键 编辑:程序博客网 时间:2024/04/30 00:50
例子一、咖啡的制作

/** * 饮料类 */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 Espresso extends Beverage{public Espresso(){description = "Espresso";}@Overridepublic double cost() {return 1.99;}}

/** * 混合咖啡 */public class HouseBlend extends Beverage{public HouseBlend(){description = "House Blend Coffee";}@Overridepublic double cost() {return 0.89;}}

/** * 摩卡,一种调料 */public class Mocha extends CondimentDecorator{Beverage beverage;public Mocha(Beverage beverage){this.beverage = beverage;}@Overridepublic String getDescription() {return beverage.getDescription() + ",Mocha";}@Overridepublic double cost() {return 0.20 + beverage.cost();}}

/** * 星巴克咖啡的制作 */public class StarbuzzCoffee {public static void main(String[] args) {Beverage beverage1 = new Espresso();//浓咖啡,不需要调料System.out.println(beverage1.getDescription() + " $" + beverage1.cost());Beverage beverage2 = new HouseBlend();//混合咖啡,需要调料beverage2 = new Mocha(beverage2);System.out.println(beverage2.getDescription() + " $" + beverage2.cost());}/** * 运行结果: * Espresso $1.99   House Blend Coffee,Mocha $1.09 */}

例子二、io流的装饰

import java.io.FilterInputStream;import java.io.IOException;import java.io.InputStream;/** * 编写自己的java IO装饰者 * 把流内的所有大写字符转成小写 * FilterInputStream 包含其他一些输入流,它将这些流用作其基本数据源, * 它可以直接传输数据或提供一些额外的功能。FilterInputStream 类本身只 * 是简单地重写那些将所有请求传递给所包含输入流的 InputStream 的所有方法。 */public class LowerCaseInputStream extends FilterInputStream{/** * @param in */protected LowerCaseInputStream(InputStream in) {super(in);}//重写,转化为小写@Overridepublic int read() throws IOException {int c = super.read();return (c == -1 ? c : Character.toLowerCase((char)c));}//重写,转化为小写@Overridepublic int read(byte[] b, int off, int len) throws IOException {int result = super.read(b, off, len);for(int i = off; i < off + result; i++){b[i] = (byte)Character.toLowerCase((char)b[i]);}return result;}}
import java.io.BufferedInputStream;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;/** * 测试java IO装饰者 */public class TestLowerCaseInStr {public static void main(String[] args) throws IOException {int c;InputStream in = new LowerCaseInputStream(new BufferedInputStream(new FileInputStream("C:\\Format.txt")));while((c = in.read()) >= 0){System.out.println((char)c);}in.close();}}