设计模式(13):JAVA(13):设计模式(6)装饰器模式:允许向一个现有的对象添加新的功能,同时又不改变其结构
时间:2021-09-04
本文章向大家介绍设计模式(13):JAVA(13):设计模式(6)装饰器模式:允许向一个现有的对象添加新的功能,同时又不改变其结构,主要包括设计模式(13):JAVA(13):设计模式(6)装饰器模式:允许向一个现有的对象添加新的功能,同时又不改变其结构使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
例1
package com.woniuxy.m_decorator.a; /* 星巴克是卖咖啡的, 一开始饮料种类比较少,所以使用继承,看不出什么问题。 每种咖啡,都有描述,都有价格。 这是所有咖啡的共性,既然是共性,就要上提到父类中。 */ abstract class Beverage { private String description; public Beverage(String description) { super(); this.description = description; } public abstract double cost(); } class DarkRoast extends Beverage { public DarkRoast(String descriptoin) { super(descriptoin); } public double cost() { return 10; } } class Decaf extends Beverage { public Decaf(String description) { super(description); } @Override public double cost() { return 8; } } class Espresso extends Beverage { public Espresso(String description) { super(description); } @Override public double cost() { return 12; } } class HouseBlend extends Beverage { public HouseBlend(String description) { super(description); } @Override public double cost() { return 15; } } public class Test { }
例2
星巴克,业务壮大了,为了把同业抛开,它加了新的花样: 4种调料:
蒸奶(steamed Milk)、豆浆(Soy)、摩卡(Mocha)、打起奶泡(Whip)
针对于DrakRoast咖啡,可以有以下几种变化:
DrakRoast
DrakRoastWithSteamedMilk
DrakRoastWithSoy
DrakRoastWithMocha
DrakRoastWithWhip
DrakRoastWithSteamedMilkAndSoy
.....
类,爆炸了!! 程序员,疯了!!
例3
package com.woniuxy.m_decorator.c; // 为了解决b包的问题, // 作者,尝试这样来解决: // 优点,没有类爆炸! class Beverage { private String description; private boolean steamedMilk; private boolean soy; private boolean mocha; private boolean whip; public Beverage(String description) { super(); this.description = description; } public double cost() { double cost = 0; if(steamedMilk) { cost += 0.2; } if(soy) { cost += 0.2; } if(mocha) { cost += 0.3; } if(whip) { cost += 0.1; } return cost; } /* public double cost(Map map) { double cost = 0; for(Entry e : map.entrySet() ) { cost += e.getValue(); } return cost; } public String description(Map map) { String str = 0; for(Entry e : map.entrySet() ) { str += e.getKey() + " "; } return str; } Map map = new HashMap(); map.put("Milk", 0.2); map.put("Soy", 0.2); map.put("Whip", 0.1); map.put("GouqI", 0.1); cost(map); getDescription(map); */ public boolean isSteamedMilk() { return steamedMilk; } public void setSteamedMilk(boolean steamedMilk) { this.steamedMilk = steamedMilk; } public boolean isSoy() { return soy; } public void setSoy(boolean soy) { this.soy = soy; } public boolean isMocha() { return mocha; } public void setMocha(boolean mocha) { this.mocha = mocha; } public boolean isWhip() { return whip; } public void setWhip(boolean whip) { this.whip = whip; } } class DarkRoast extends Beverage { public DarkRoast(String descriptoin) { super(descriptoin); } public double cost() { return super.cost() + 10; } /* public String getDescription(Map map) { return descriptoin + super.getDesciption(Map map); } */ } class Decaf extends Beverage { public Decaf(String description) { super(description); } @Override public double cost() { return super.cost() + 8; } } class Espresso extends Beverage { public Espresso(String description) { super(description); } @Override public double cost() { return super.cost() + 12; } } class HouseBlend extends Beverage { public HouseBlend(String description) { super(description); } @Override public double cost() { return super.cost() + 15; } } // ========================================================= class Tea extends Beverage { public Tea(String description) { super(description); } public double cost() { return super.cost() + 9; } } public class Test { public static void main(String[] args) { DarkRoast dr = new DarkRoast("焦炒咖啡"); dr.setMocha(true); dr.setSoy(true); System.out.println(dr.cost()); HouseBlend hb = new HouseBlend("混合咖啡"); hb.setWhip(true); System.out.println(hb.cost()); Tea tea = new Tea("凉茶"); tea.setSoy(true); System.out.println(tea.cost()); } } // 缺点: // 现在多了一个调料:枸杞。
例4
package com.woniuxy.m_decorator.d; import java.io.IOException; // 为了解决c包的问题, abstract class Beverage { private String description; public Beverage(String description) { super(); this.description = description; } public abstract double cost(); public String getDescription() { return description; } } class DarkRoast extends Beverage { public DarkRoast(String descriptoin) { super(descriptoin); } public double cost() { return 10; } } class Decaf extends Beverage { public Decaf(String description) { super(description); } @Override public double cost() { return 8; } } class Espresso extends Beverage { public Espresso(String description) { super(description); } @Override public double cost() { return 12; } } class HouseBlend extends Beverage { public HouseBlend(String description) { super(description); } @Override public double cost() { return 15; } } abstract class CondimentDecorator extends Beverage { public CondimentDecorator() { super("调料"); } public abstract double cost(); } class Milk extends CondimentDecorator { private Beverage beverage; public Milk(Beverage beverage) { this.beverage = beverage; } @Override public double cost() { return beverage.cost() + 0.2; } @Override public String getDescription() { return beverage.getDescription() + " 牛奶"; } } class Mocha extends CondimentDecorator{ private Beverage beverage; public Mocha(Beverage beverage) { this.beverage = beverage; } @Override public double cost() { return beverage.cost() + 0.3; } @Override public String getDescription() { return beverage.getDescription() + " 摩卡"; } } class Soy extends CondimentDecorator { private Beverage beverage; public Soy(Beverage beverage) { this.beverage = beverage; } @Override public double cost() { return beverage.cost() + 0.2; } @Override public String getDescription() { return beverage.getDescription() + " 豆浆"; } } class Whip extends CondimentDecorator { private Beverage beverage; public Whip(Beverage beverage) { this.beverage = beverage; } @Override public double cost() { return beverage.cost() + 0.1; } @Override public String getDescription() { return beverage.getDescription() + " 奶泡"; } } // ========================================================= class GouQi extends CondimentDecorator { private Beverage beverage; public GouQi(Beverage beverage) { super(); this.beverage = beverage; } @Override public String getDescription() { return beverage.getDescription() + " 枸杞"; } @Override public double cost() { return beverage.cost() + 0.4; } } public class Test { public static void main(String[] args) throws IOException { Beverage b = new DarkRoast("焦炒咖啡"); Beverage b2 = new Milk(b); Beverage b3 = new Soy(b2); Beverage b4 = new Whip(b3); Beverage b5 = new Milk(b4); Beverage b6 = new GouQi(b5); System.out.println(b6.getDescription() + ":" + b6.cost()); } }
例5
package com.woniuxy.m_decorator.e; import java.io.FileReader; import java.io.FilterReader; import java.io.IOException; import java.io.Reader; // 根据已有功能,做出更强大的功能! class MyBufferedReader extends FilterReader { private Reader in; protected MyBufferedReader(Reader in) { super(in); this.in = in; } public String readLine() throws IOException { StringBuilder sb = new StringBuilder(""); int n = 0; while((n = in.read()) != -1) { if(n == '\r' ) { continue; } if(n == '\n' ) { break; } sb.append((char)n); } // 流程能走到这里,n有几种可能? 一个是-1, 是\n return n == -1 ? null: sb.toString(); } @Override public void close() throws IOException { in.close(); } } public class Test { public static void main(String[] args) throws Exception { Reader in = new FileReader("F:\\1.txt"); MyBufferedReader mbr = new MyBufferedReader(in); String line = null; while((line = mbr.readLine()) != null) { System.out.println(line); } mbr.close(); } }
本文来自博客园,作者:秋华,转载请注明原文链接:https://www.cnblogs.com/qiu-hua/p/15227406.html
原文地址:https://www.cnblogs.com/qiu-hua/p/15227406.html
- ASP.NET MVC4 Web API 堆栈将添加指定消息处理功能
- 页面copyright部分始终居于页面底部
- Hammock for REST
- 网页超过一屏时自动浮动在网页最上方的图层特效
- 关于gcc、glibc和binutils模块之间的关系
- 贝叶斯过滤算法
- 強大的jQuery Chart组件-Highcharts
- vue2.0 配置 选项 属性 方法 事件 ——速查
- 亲密接触IIS 8和Web Deploy 3.0
- vue2.0 组件通信
- 在MongoDB中实现聚合函数
- 原生JS编写的照片墙效果实例演示特效
- 使用SuperWebSocket 构建实时 Web 应用
- Vue2.0的变化 ,组件模板,生命周期,循环,自定义键盘指令,过滤器
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 如何在JSP里使用Java bean
- 获取指定时间内指定星期几的所有日期
- 使用JSP的标准标签库JSTL处理XML格式的数据
- (一)初识Mybatis-Plus
- org.apache.tomcat.util.scan.StandardJarScanner找不到serializer.jar的问题
- JAVA中获取当前系统时间
- 使用Supervisor管理进程
- vue 中使用threejs
- 数据库COUNT(*)、COUNT(字段)和COUNT(1)的异同
- 生成项目目录树
- 几行代码搞定智能插座控制丨云开发 × 涂鸦
- Elasticsearch Mapping是啥?
- 求水仙花数面试题 撸它
- 字典序???你是啥
- 【特征工程】时序特征挖掘的奇技淫巧