目录
Decorator 装饰者模式
目录
[TOC]
1. 概述
1.1. Head First设计模式定义
装饰者模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰者来包裹真实的对象。
所以装饰者可以动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的方案。
1.2. 自我理解
(1)假设我们手头已经有了一个类,可以执行一些功能
(2)但是我们还是希望对这个类的功能做一些增强,此时怎么办呢?基于已有的类的功能基础之上,再增强一些功能,可以做装饰
装饰器模式有一些非常经典的实现
(1)比如java的io体系,可以一层包装一层,一层包装一层,外面的一层,都会对立面的一层进行功能的增强。
(2)还有就是spring的aop,aop这块可以基于动态代理的理念,装饰我们的目标对象,然后加入事务控制,日志打印之类的功能。
1.3. 装饰者模式的组成
抽象构件 (Component):给出抽象接口或抽象类,以规范准备接收附加功能的对象。
具体构件 (ConcreteComponent):定义将要接收附加功能的类。
抽象装饰 (Decorator):装饰者共同要实现的接口,也可以是抽象类。
具体装饰 (ConcreteDecorator):持有一个 Component 对象,负责给构件对象“贴上”附加的功能。
2. UML
3. Example
3.1. 场景
1、拿一个深焙咖啡 (DarkRoast) 对象
2、以摩卡 (Mocha) 装饰它
3、以豆浆 (Soy) 装饰它
4、调用 cost() 方法,并依赖委托将调料的价钱加上去
3.2. 代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
package com.loserzhao.jomin.designpattern.decorator; /** * Created * Date: 2021/07/19 15:05 <br/> * Description: HeadFirst装饰者模式.咖啡Demo * * @author jomin@loserzhao.com * @see */ public class HeadFirstDecoratorPatternDemo { /** * 饮料 */ public static abstract class Beverage{ String description = "Unknow Beverage"; public String getDescription() { return description; } public abstract double cost(); } /** * 调料装饰者 */ public static abstract class CondimentDecorator extends Beverage{ public abstract String getDescription(); } /** * 浓缩咖啡 */ public static class Espresso extends Beverage{ public Espresso() { description = "Espresso Coffee"; } @Override public double cost() { return 1.99; } } /** * 另外一种咖啡,和浓缩咖啡一样,只是价钱不同 */ public static class HouseBlend extends Beverage{ public HouseBlend() { description = "House Blend Coffee"; } @Override public double cost() { return 0.89; } } /** * 咖啡 */ public static class DarkRoast extends Beverage{ public DarkRoast() { description = "Dark Roast Coffee"; } @Override public double cost() { return 3.99; } } /** * 调料:抹茶 */ public static class Mocha extends CondimentDecorator{ Beverage beverage; public Mocha(Beverage beverage) { this.beverage = beverage; } @Override public String getDescription() { return beverage.getDescription() + ", Mocha"; } @Override public double cost() { return 0.20 + beverage.cost(); } } /** * 调料:大豆 */ public static class Soy extends CondimentDecorator{ Beverage beverage; public Soy(Beverage beverage) { this.beverage = beverage; } @Override public String getDescription() { return beverage.getDescription() + ", Soy"; } @Override public double cost() { return 0.10 + beverage.cost(); } } public static void main(String[] args) { Beverage beverage = new Espresso(); System.out.println(beverage.getDescription() + " $" + beverage.cost()); Beverage darkRoastBeverage = new DarkRoast(); darkRoastBeverage = new Mocha(darkRoastBeverage); darkRoastBeverage = new Mocha(darkRoastBeverage); darkRoastBeverage = new Soy(darkRoastBeverage); System.out.println(darkRoastBeverage.getDescription() + " $" + darkRoastBeverage.cost()); } } |
3.3. 运行结果
1 2 3 |
Espresso Coffee $1.99 Dark Roast Coffee, Mocha, Mocha, Soy $4.49 |
原创文章,转载请注明: 转载自LoserZhao – 诗和远方[ http://www.loserzhao.com/ ]
本文链接地址: http://www.loserzhao.com/java/designpattern/decorator-designpattern.html
文章的脚注信息由WordPress的wp-posturl插件自动生成
0 条评论。