装饰器模式2

本文通过一个奶茶店的实例,详细解析了装饰者模式的设计原则和实现方式。介绍了如何通过装饰者模式动态地为对象添加职责,而不改变其结构,使系统更加灵活和可扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 抽象角色component,定义一组公共接口
/**
 * 定义顶层喝奶茶的接口
 * @author 10191192
 * @date 2019/9/10
 */
public interface DrinkMilkTea {

	float getTotalPrice();

	String useMaterial();
}
  1. 具体的构建角色,被装饰者类
/**
 * 焦糖奶茶类,实现顶层的接口,本质就是核心组件
 * @author 10191192
 * @date 2019/9/10
 */
public class CaramelMilkTea implements DrinkMilkTea {

	@Override
	public float getTotalPrice() {
		return 12;
	}

	@Override
	public String useMaterial() {
		return "焦糖奶茶";
	}
}
  1. Decorator装饰角色,扩展 抽象角色component的功能,持有componet的角色
/**
 * 奶茶具体材料不清楚,定义一个抽象的装饰器,让子类去设计实现什么样的装饰材料
 * 但是单独定义没有意义,需要将材料放在奶茶中才能体现价值
 * 因此需要实现顶层的奶茶接口,并持有奶茶实例进行相关操作
 * @author 10191192
 * @date 2019/9/10
 */
public abstract class MilkTeaMaterialDecorator implements DrinkMilkTea {

	protected DrinkMilkTea drinkMilkTea;

	public MilkTeaMaterialDecorator(DrinkMilkTea drinkMilkTea) {
		this.drinkMilkTea = drinkMilkTea;
	}

	@Override
	public float getTotalPrice() {
		return drinkMilkTea.getTotalPrice();
	}

	@Override
	public String useMaterial() {
		return drinkMilkTea.useMaterial();
	}
}
  1. 具体的装饰角色,实现具体的扩展的componet的功能
/**
 * 布丁装饰器类,负责布往奶茶中加入布丁材料
 * @author 10191192
 * @date 2019/9/10
 */
public class PuddingMaterialDecorator extends MilkTeaMaterialDecorator {

	public PuddingMaterialDecorator(DrinkMilkTea drinkMilkTea) {
		super(drinkMilkTea);
	}

	@Override
	public float getTotalPrice() {
		return super.getTotalPrice() + 2;
	}

	@Override
	public String useMaterial() {
		return super.useMaterial() + ",添加 : 布丁.";
	}
}
/**
 * 青稞装饰器类,负责往奶茶中加入青稞材料
 * @author 10191192
 * @date 2019/9/10
 */
public class HighlandBarleyMaterialDecorator extends MilkTeaMaterialDecorator {

	public HighlandBarleyMaterialDecorator(DrinkMilkTea drinkMilkTea) {
		super(drinkMilkTea);
	}

	@Override
	public float getTotalPrice() {
		return super.getTotalPrice() + 3;
	}

	@Override
	public String useMaterial() {
		return super.useMaterial() + ",添加 : 青稞.";
	}
}
  1. 具体使用
public class TestDemo {

	public static void main(String[] args) {

		// 实例化一个焦糖奶茶
		DrinkMilkTea milkTea = new CaramelMilkTea();
		System.out.println(milkTea.useMaterial() + " 总价: " + milkTea.getTotalPrice());

		//添加布丁
		milkTea = new PuddingMaterialDecorator(milkTea);
		System.out.println(milkTea.useMaterial() + " 总价: " + milkTea.getTotalPrice());

		// 添加青稞
		milkTea = new HighlandBarleyMaterialDecorator(milkTea);
		System.out.println(milkTea.useMaterial() + " 总价: " + milkTea.getTotalPrice());System.out.println(milkTea.useMaterial() + " 总价: " + milkTea.getTotalPrice());

		// 添加第二份青稞
		milkTea = new HighlandBarleyMaterialDecorator(milkTea);
		System.out.println(milkTea.useMaterial() + " 总价: " + milkTea.getTotalPrice());

	}
}
资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 当使用 MySQL 5.5 版本的用户在 Windows 系统下忘记 root 账户密码时,可采用以下两种方法解决。 方法一:命令行操作 先关闭 MySQL 服务,通过命令提示符输入“net stop mysql”来实现。 接着用“mysqld --skip-grant-tables”命令启动 MySQL 服务,这样启动时不会加载权限表,能绕过密码验证直接登录。 打开新的命令提示符窗口,进入 MySQL 的 bin 目录,执行“mysql”命令启动客户端程序,无需密码即可登录。 登录后,输入“show databases;”查看所有数据库。 使用“use mysql;”切换到 mysql 数据库。 执行“update users set password=PASSWORD(新密码) where user=root;”更新 root 用户密码,其中“新密码”是自己想设置的密码。 输入“flush privileges;”重新加载权限表。 输入“quit”退出客户端,再通过“net start mysql”重启 MySQL 服务。 方法二:通过默认账户登录 在 Windows 命令提示符中停止 MySQL 服务。 直接运行“mysql -u root”启动 MySQL 客户端,可能需以管理员身份运行命令提示符,或使用有默认无密码登录权限的用户。 在客户端执行“use mysql;”进入 mysql 数据库。 再执行“update users set password=PASSWORD(新密码) where user=root;”更新密码。 执行“flush privileges;”重新加载权限表。 输入“quit”退出客户端,重启 MySQL 服务。 操作时要注意:Windows 下路径和
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值