1 简介
–《百度百科 装饰模式》
3种设计模式之一,英文叫Decorator Pattern,又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
2 具体操作及实现
举例:蛋糕的制作
抽象构件角色:Dessert 甜点
package cn.shentianlan.studytest.designmode.decorator.example;
/**
* @author 渊蓝
* @version 1.0
* @description 甜点(抽象构件角色)
* @date 2021/10/18 21:19
*/
public abstract class Dessert {
String materials = "未知材料";
public abstract String getMaterials();
}
抽象构件实例-具体构件角色:Cake 普通蛋糕
package cn.shentianlan.studytest.designmode.decorator.example;
/**
* @author 渊蓝
* @version 1.0
* @description 普通蛋糕(具体构件角色)
* @date 2021/10/18 21:24
*/
public class Cake extends Dessert {
@Override
public String getMaterials() {
return "一个由面粉、鸡蛋、水烤制而成的八寸戚风蛋糕";
}
}
抽象装饰者对象-对具体构件角色进行修饰的对象:DecorativeMaterial 蛋糕装饰材料
package cn.shentianlan.studytest.designmode.decorator.example;
/**
* @author 渊蓝
* @version 1.0
* @description 蛋糕装饰材料(装饰角色)
* @date 2021/10/18 21:28
*/
public abstract class DecorativeMaterial extends Dessert {
@Override
public abstract String getMaterials();
}
具体装饰对象:Cream、Fruit、Chocolate 奶油、水果、巧克力
package cn.shentianlan.studytest.designmode.decorator.example;
/**
* @author 渊蓝
* @version 1.0
* @description 奶油(具体装饰角色)
* @date 2021/10/18 21:30
*/
public class Cream extends DecorativeMaterial{
Dessert dessert;
public Cream(Dessert dessert) {
this.dessert = dessert;
}
@Override
public String getMaterials() {
return dessert.getMaterials()+",加点淡奶油";
}
}
package cn.shentianlan.studytest.designmode.decorator.example;
/**
* @author 渊蓝
* @version 1.0
* @description 水果(具体装饰角色)
* @date 2021/10/18 21:33
*/
public class Fruit extends DecorativeMaterial {
Dessert dessert;
public Fruit(Dessert dessert) {
this.dessert = dessert;
}
@Override
public String getMaterials() {
return dessert.getMaterials()+",加点水果";
}
}
package cn.shentianlan.studytest.designmode.decorator.example;
/**
* @author 渊蓝
* @version 1.0
* @description 巧克力(具体装饰角色)
* @date 2021/10/18 21:35
*/
public class Chocolate extends DecorativeMaterial {
Dessert dessert;
public Chocolate(Dessert dessert) {
this.dessert = dessert;
}
@Override
public String getMaterials() {
return dessert.getMaterials()+",加点巧克力";
}
}
测试:FruitBirthdayCakeMaker 水果蛋糕的制作
package cn.shentianlan.studytest.designmode.decorator.example;
/**
* @author 渊蓝
* @version 1.0
* @description 水果生日蛋糕制作(具体测试)
* @date 2021/10/18 21:38
*/
public class FruitBirthdayCakeMaker {
public static void main(String[] args) {
Dessert dessert = new Cake();
System.out.println(dessert.getMaterials());
dessert = new Fruit(dessert);
System.out.println(dessert.getMaterials());
dessert = new Chocolate(dessert);
System.out.println(dessert.getMaterials());
//简写版
Dessert cake = new Cake();
System.out.println("普通蛋糕:"+cake.getMaterials());
cake = new Cream(new Fruit(new Chocolate(cake)));
System.out.println("水果蛋糕:"+cake.getMaterials());
}
}
结果:
一个由面粉、鸡蛋、水烤制而成的八寸戚风蛋糕
一个由面粉、鸡蛋、水烤制而成的八寸戚风蛋糕,加点水果
一个由面粉、鸡蛋、水烤制而成的八寸戚风蛋糕,加点水果,加点巧克力
普通蛋糕:一个由面粉、鸡蛋、水烤制而成的八寸戚风蛋糕
水果蛋糕:一个由面粉、鸡蛋、水烤制而成的八寸戚风蛋糕,加点巧克力,加点水果,加点淡奶油
3 相关事项
- Java I/O标准库的设计中大量使用装饰者模式
- 个人感觉比较好的文章:设计模式详解——装饰者模式