第一章:咸亨惊变
绍兴咸亨酒店的柜台结着蛛网,孔乙己蜷缩在门槛旁,手指在积灰的台面上虚划:“茴字第六种写法,当用篆书变体……”一阵刺目的白光突然吞没长街,他最后的意识停留在青石板路上跳动的二维码光影。
第二章:数字围城
2023年的杭州,孔乙己蹲在地铁口啃着包子,手机播放着《现代生存指南》。三个月前外卖员发现他昏倒在西湖边,病号服上还别着晚清的铜钱。此刻他正用毛笔小楷记录:“支付宝非宝,扫码
即通;茴香非香,美团可购。”
第三章:茶饮维新
秋分那天,“乙己茶寮”在网红街开张。孔乙己改良了《调鼎集》里的古法茶汤,用虹吸壶萃取龙井茶底,玻璃柜里陈列着九宫格小料:桂花冻、酒酿圆子、甘草梅片……开业当天,打卡的年轻人挤掉了他的玳瑁眼镜。
// 初代奶茶系统(未用设计模式)
public class MilkTea {
private String teaBase; // 茶底
private List<String> toppings = new ArrayList<>(); // 配料
public void setTeaBase(String teaBase) {
this.teaBase = teaBase;
}
public void addTopping(String topping) {
toppings.add(topping);
}
// 计算价格时需不断修改判断逻辑
public double calculatePrice() {
double price = 8.0; // 基础价格
for (String top : toppings) {
if (top.equals("桂花冻")) price += 2;
else if (top.equals("酒酿圆子")) price += 3;
// 每新增配料就要加判断
}
return price;
}
}
第四章:流量迷局
冬至深夜,孔乙己盯着暴跌的营业额曲线。对面新开的连锁奶茶店推出“第二杯半价”,电子屏滚动着“算法推荐最优搭配”。他蘸着奶茶在纸巾上写:“今之商战,犹八股取士,套路胜于真味。”
第五章:破局之光
清明雨纷纷,孔乙己在垃圾站捡回被丢弃的“DIY套餐盒”。灵感如闪电划过——次日在店门口竖起木牌:“本店提供七十二味基底、三百六十种小料,诸君自为调饮师。”中学生用普洱打底加跳跳糖,短视频#奶茶科举#冲上热搜。
// 茶饮组件接口(符合开闭原则)
interface TeaComponent {
String getDescription();
double getPrice();
}
// 基础茶底实现
class BasicTea implements TeaComponent {
private String teaName;
public BasicTea(String name) { this.teaName = name; }
@Override
public String getDescription() { return teaName; }
@Override
public double getPrice() { return 8.0; }
}
// 装饰器抽象类
abstract class ToppingDecorator implements TeaComponent {
protected TeaComponent decoratedTea;
public ToppingDecorator(TeaComponent tea) {
this.decoratedTea = tea;
}
}
// 具体装饰器(跳跳糖)
class PoppingCandy extends ToppingDecorator {
public PoppingCandy(TeaComponent tea) {
super(tea);
}
@Override
public String getDescription() {
return decoratedTea.getDescription() + "+跳跳糖";
}
@Override
public double getPrice() {
return decoratedTea.getPrice() + 3.0;
}
}
// 具体装饰器(黄酒冻)
class WineJelly extends ToppingDecorator {
public WineJelly(TeaComponent tea) {
super(tea);
}
@Override
public String getDescription() {
return decoratedTea.getDescription() + "+绍兴黄酒冻";
}
@Override
public double getPrice() {
return decoratedTea.getPrice() + 5.0;
}
}
// 客户端使用示例
public class Main {
public static void main(String[] args) {
// 组合出网红爆款:龙井+跳跳糖+黄酒冻
TeaComponent specialTea = new WineJelly(
new PoppingCandy(
new BasicTea("西湖龙井")));
System.out.println(specialTea.getDescription());
// 输出:西湖龙井+跳跳糖+绍兴黄酒冻
System.out.println("价格:" + specialTea.getPrice());
// 输出:16.0
}
}
终章:咸亨新生
大雪覆满南宋御街,孔乙己在改造后的咸亨茶馆举办“调饮雅集”。全息投影展示着《茶经》里的唐代茶器,年轻人却争相用AR技术往虚拟茶盏里叠加小料。他抚摸着新刻的店训木牌:“守正于茶骨,出奇在人心。”
(玻璃幕墙倒映着街角倒闭的连锁奶茶店,LED残影拼出个歪斜的“茴”字)
----------------------------------------------------技术解密---------------------------------------------------------------
孔乙己靠着一手diy成功翻身,那么装饰者模式又是什么呢?
装饰者模式允许向一个现有的对象添加新的功能,同时又不改变其结构。它通过创建一个装饰者类,将原始对象包装在其中,并在不修改原始对象代码的情况下,动态地为其添加额外的行为或职责。
该代码完整实现了装饰者模式的四个核心组件
// 1. 组件接口(Component)
interface TeaComponent {
String getDescription();
double getPrice();
}
// 2. 具体组件(ConcreteComponent)
class BasicTea implements TeaComponent {
// 基础茶底实现
}
// 3. 装饰器抽象类(Decorator)
abstract class ToppingDecorator implements TeaComponent {
protected TeaComponent decoratedTea; // 关键组合关系
}
// 4. 具体装饰器(ConcreteDecorator)
class PoppingCandy extends ToppingDecorator {
// 具体装饰实现
}
模式变体对比

典型应用场景
.需要动态/透明地添加职责
.不适合使用子类扩展的情况
.需要撤销或修改已添加的功能
.组合爆炸风险较高的系统