设计模式:装饰者
2016-12-15 00:00
127 查看
首先用IO实现一下将读取的所有英文字母转成小写。
由此就可在不改变原有对象(不在原类中添加方法)的情况下,满足上述要求。
下面,将用星巴克咖啡为例子说明装饰者模式。
首先,先定义一个超类:饮料。
然后定义一个超类,要往饮料里面添加的佐料
定义一种饮料 黑玫瑰
另一种饮料 Decaf
又一种饮料
还是一种饮料
接下来是搭配的一些佐料,流奶。
摩卡
准备好这些,咖啡店可以开张了。
以上例子中,不断对同一种饮料加其他东西(用装饰者进行包装。改变对象的原本属性。)特点就是不改变原对象的任何属性!!
import java.io.*; public class LowerCaseInputStream extends FilterInputStream { public LowerCaseInputStream(InputStream in) { super(in); } public int read() throws IOException { int c = in.read(); return (c == -1 ? c : Character.toLowerCase((char)c)); } public int read(byte[] b, int offset, int len) throws IOException { int result = in.read(b, offset, len); for (int i = offset; i < offset+result; i++) { b[i] = (byte)Character.toLowerCase((char)b[i]); } return result; } }
public class InputTest { public static void main(String[] args) throws IOException { int c; try { InputStream in = new LowerCaseInputStream( new BufferedInputStream( new FileInputStream("test.txt"))); while((c = in.read()) >= 0) { System.out.print((char)c); } in.close(); } catch (IOException e) { e.printStackTrace(); } } }
由此就可在不改变原有对象(不在原类中添加方法)的情况下,满足上述要求。
下面,将用星巴克咖啡为例子说明装饰者模式。
首先,先定义一个超类:饮料。
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 DarkRoast extends Beverage { public DarkRoast() { description = "Dark Roast Coffee"; } public double cost() { return .99; } }
另一种饮料 Decaf
public class Decaf extends Beverage { public Decaf() { description = "Decaf Coffee"; } public double cost() { return 1.05; } }
又一种饮料
public class Espresso extends Beverage { public Espresso() { description = "Espresso"; } public double cost() { return 1.99; } }
还是一种饮料
public class HouseBlend extends Beverage { public HouseBlend() { description = "House Blend Coffee"; } public double cost() { return .89; } }
接下来是搭配的一些佐料,流奶。
public class Milk extends CondimentDecorator { Beverage beverage; public Milk(Beverage beverage) { this.beverage = beverage; } public String getDescription() { return beverage.getDescription() + ", Milk"; } public double cost() { return .10 + beverage.cost(); } }
摩卡
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 .20 + beverage.cost(); } }
public class Soy extends CondimentDecorator { Beverage beverage; public Soy(Beverage beverage) { this.beverage = beverage; } public String getDescription() { return beverage.getDescription() + ", Soy"; } public double cost() { return .15 + beverage.cost(); } }
public class Whip extends CondimentDecorator { Beverage beverage; public Whip(Beverage beverage) { this.beverage = beverage; } public String getDescription() { return beverage.getDescription() + ", Whip"; } public double cost() { return .10 + beverage.cost(); } }
准备好这些,咖啡店可以开张了。
public static void main(String args[]) { Beverage beverage = new Espresso(); System.out.println(beverage.getDescription() + " $" + beverage.cost()); Beverage beverage2 = new DarkRoast(); beverage2 = new Mocha(beverage2); beverage2 = new Moch 3ff0 a(beverage2); beverage2 = new Whip(beverage2); System.out.println(beverage2.getDescription() + " $" + beverage2.cost()); Beverage beverage3 = new HouseBlend(); beverage3 = new Soy(beverage3); beverage3 = new Mocha(beverage3); beverage3 = new Whip(beverage3); System.out.println(beverage3.getDescription() + " $" + beverage3.cost()); } }
以上例子中,不断对同一种饮料加其他东西(用装饰者进行包装。改变对象的原本属性。)特点就是不改变原对象的任何属性!!
相关文章推荐
- 设计模式:工厂
- 设计模式:单例
- 设计模式:命令
- 设计模式:适配器
- 微信SDK使用demo
- jquery.datetimepicker 使用感悟
- mongo的密集索引与稀疏索引
- Chrome 扩展 SecureShell 删除指定 known host fingerprint
- 1613-3-傅溥衍 总结《2016年12月14日》【连续第七十五天总结】
- docker 出现 client is newer than server 的解决方案
- redis-game-transaction
- 向tomcat学习jmx
- 自己开发的一个轻量级的记录工具,欢迎拍砖,觉得有意思的可以一起来开发。
- C语言求ln2
- Virtualbox设置虚拟机访问外网以及主机访问虚拟机
- thrift入门教程
- vs2013编译OGRE::error c1060 compiler is out of heap space
- 微信小程序调查报告(二)-账号注册篇
- dataTables本地刷新数据解决只能初始化一次问题
- dataTables中文排序以及中英文混排乱序问题解决