一、装饰器模式
1、装饰器模式
装饰器模式(Decorator Pattern)是一种结构型设计模式。允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰器模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
2、实现思路
(1)、定义实体的抽象类或接口(如:饮料抽象类)。
(2)、实例实体类,实现抽象类(如:奶茶,果茶)。
(3)、定义装饰抽象类,需要实现抽象类,同时定义包含抽象类的成员属性(如:配料)
(4)、定义装饰抽象类的实体类(如:珍珠,可可,椰果等)
(5)、通过装饰类创建原对应的引用。
二、代码示例
1、代码示例
java
// 饮料,抽象类
@Data
public abstract class Beverage {
protected String name;
protected double price;
}
// 奶茶,饮料的实现类1
public class MilkTea extends Beverage {
@Override
public String getName() {
return "奶茶";
}
@Override
public double getPrice() {
return 3.5;
}
}
// 果茶,饮料的实现类2
public class FruitTea extends Beverage {
@Override
public String getName() {
return "果茶";
}
@Override
public double getPrice() {
return 2;
}
}
// 装饰抽象类,需要实现且包含饮料属性
public abstract class Batching extends Beverage {
protected Beverage beverage;
}
// 珍珠,装饰类的实现类1
public class Pearl extends Batching {
public Pearl(Beverage beverage){ // 通过构造方法封装实现的饮料实体类,也可以自定义方法封装
this.beverage = beverage;
}
@Override
public String getName() {
return "珍珠"+beverage.getName();
}
@Override
public double getPrice() {
return 1.5+beverage.getPrice();
}
}
// 可可,装饰类的实现类2
public class Coco extends Batching{
public Coco(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getName() {
return "可可"+beverage.getName();
}
@Override
public double getPrice() {
return 2+beverage.getPrice();
}
}
// 测试
public static void main(String[] args) {
Beverage drink = new MilkTea();
System.out.println(drink);
drink = new Coco(new MilkTea());
System.out.println(drink);
}
运行结果:可以看出可以直接生成奶茶类,也可以生成带配料的奶茶类。当然可以通过工厂模式对创建的过程在进一步封装。
总结:
定义的装饰类为抽象类,需要实现原抽象类且包含原抽象类的成员属性。通过构造或者自定义的方法,将原实体对象放入装饰类的实体中,这样通过装饰类就可以获取原对象处理后的实体类。
代码套路和适配器模式比较类似,适配器模式相当于对原功能的转接,装饰者模式相当于对原功能的进一步加强。
学海无涯苦作舟!!!