装饰者模式
装饰者模式:
意图:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰者模式相比生成子类更为灵活,该模式以对客户端透明的方式扩展对象的功能
适用环境:在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
通俗来讲,比如我们开个饮品店,主要卖牛奶,但是由于不同的需要,有的需要牛奶+糖,有的需要牛奶+珍珠,有的需要牛奶+冰等等等等,当然不同的方式,所需要的价格不一样,我们怎么办,每一种方式都写一个实现类嘛,这样实现类只会越来越多,这是我们就需要一个装饰类来处理这种事情,饮品店和牛奶就是我们被装饰的接口和被装饰的类,是比较抽象哈,上代码。
被装饰的接口:
public interface Milk {
/**
* 计算价格
*/
float price();
/**
* 牛奶成分的描述
*/
String describe();
}
被装饰的类:
public class DrinkMilk implements Milk {
@Override
public float price() {
return 10f;
}
@Override
public String describe() {
return "牛奶";
}
}
具体的装饰类:
public abstract class Decorator implements Milk {
private final Milk milk;
public Decorator(Milk milk) {
this.milk = milk;
}
@Override
public float price() {
return milk.price();
}
@Override
public String describe() {
return milk.describe();
}
}
比如加鸡蛋(我们只需要继承这个装饰类就可以了)
public class Egg extends Decorator {
public Egg(Milk milk) {
super(milk);
}
@Override
public float price() {
return super.price() + 2;
}
@Override
public String describe() {
return super.describe() + "加鸡蛋";
}
}
同样,比如加珍珠
public class Pearl extends Decorator {
public Pearl(Milk milk) {
super(milk);
}
@Override
public float price() {
return super.price() + 2;
}
@Override
public String describe() {
return super.describe() + "加珍珠";
}
}
测试代码
public class Test1 {
public static void main(String[] args) {
// 一杯牛奶
Milk milk = new DrinkMilk();
// 加鸡蛋
Egg egg = new Egg(milk);
// 加珍珠
Pearl pearl = new Pearl(egg);
System.out.println(pearl.price());// 14.0
System.out.println(pearl.describe());//牛奶加鸡蛋加珍珠
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!