Java:设计模式之结构型-装饰者模式(decorator pattern)

装饰者模式(decorator pattern): 动态地将责任附加到对象上

意图:为对象动态添加功能

类图

实现

设计不同种类的饮料,饮料可以添加配料,比如可以添加牛奶,并且支持动态添加新配料。每增加一种配料,该饮料的价格就会增加,要求计算一种饮料的价格。

项目结构

bash 复制代码
$ tree
.
├── Beverage.java                       # 接口
├── Client.java                         # 客户端调用方
└── impl
    ├── CondimentDecorator.java         # 装饰器抽象类
    ├── DarkRoast.java                  # Beverage的实现类
    ├── HouseBlend.java                 # Beverage的实现类
    ├── Milk.java                       # 装饰器抽象类的实现类
    └── Mocha.java                      # 装饰器抽象类的实现类

具体代码

java 复制代码
public interface Beverage {
    double cost();
}
java 复制代码
public class DarkRoast implements Beverage {
    @Override
    public double cost() {
        return 1;
    }
}
java 复制代码
public class HouseBlend implements Beverage {
    @Override
    public double cost() {
        return 1;
    }
}
java 复制代码
public abstract class CondimentDecorator implements Beverage {
    protected Beverage beverage;
}
java 复制代码
public class Milk extends CondimentDecorator {

    public Milk(Beverage beverage) {
        this.beverage = beverage;
    }

    @Override
    public double cost() {
        return 1 + beverage.cost();
    }
}
java 复制代码
public class Mocha extends CondimentDecorator {

    public Mocha(Beverage beverage) {
        this.beverage = beverage;
    }

    @Override
    public double cost() {
        return 1 + beverage.cost();
    }
}
java 复制代码
public class Client {
    public static void main(String[] args) {
        Beverage beverage = new HouseBlend();
        beverage = new Mocha(beverage);
        beverage = new Milk(beverage);
        System.out.println(beverage.cost());
        // 3.0
    }
}

参考文章

  1. Java 全栈知识体系:结构型 - 装饰(Decorator)
相关推荐
一只特立独行的猪6111 小时前
Java面试——集合篇
java·开发语言·面试
讓丄帝愛伱2 小时前
spring boot启动报错:so that it conforms to the canonical names requirements
java·spring boot·后端
weixin_586062022 小时前
Spring Boot 入门指南
java·spring boot·后端
未来可期LJ5 小时前
【C++ 设计模式】单例模式的两种懒汉式和饿汉式
c++·单例模式·设计模式
Dola_Pan6 小时前
Linux文件IO(二)-文件操作使用详解
java·linux·服务器
wang_book6 小时前
Gitlab学习(007 gitlab项目操作)
java·运维·git·学习·spring·gitlab
蜗牛^^O^6 小时前
Docker和K8S
java·docker·kubernetes
从心归零7 小时前
sshj使用代理连接服务器
java·服务器·sshj
IT毕设梦工厂8 小时前
计算机毕业设计选题推荐-在线拍卖系统-Java/Python项目实战
java·spring boot·python·django·毕业设计·源码·课程设计
Ylucius9 小时前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习