Java设计模式之装饰者模式《孔乙己在现代》

第一章:咸亨惊变​
 

绍兴咸亨酒店的柜台结着蛛网,孔乙己蜷缩在门槛旁,手指在积灰的台面上虚划:“茴字第六种写法,当用篆书变体……”一阵刺目的白光突然吞没长街,他最后的意识停留在青石板路上跳动的二维码光影。 

第二章:数字围城​ 

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 {
    // 具体装饰实现
}
模式变体对比


典型应用场景

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值