装饰者模式用来动态的给一个对象添加一些额外的职责。我们可以通过对一些功能的不同组合方式来创建不同的类,在这种情况下,使用装饰者设计模式是非常灵活且便捷的。
装饰者设计模式有四大角色:
(1) 抽象构建角色:定义一个抽象接口,来规范准备附加功能的类。
(2) 具体构建角色:将要被附加功能的类实现抽象构建角色接口。
(3) 抽象装饰者角色:持有对具体构建角色的引用并定义与抽象构建角色一致的接口。
(4) 具体装饰角色:实现抽象装饰者角色。负责为具体构建添加额外功能。
案列实现,需求是提供不同种类的咖啡,如加糖、加奶、加冰、加糖加奶等等,这些元素就是需要添加的额外功能。
先建立一个基础接口
/*
* 创建基类接口Coffee,装饰者和被装饰者要实现这个接口
*/
public interface Coffee {
String drink();
}
再建立一个需要被装饰的基础类
再建立一个抽象装饰者角色
两个具体的装饰功能类
通过不同功能之间的对象传递,就可以实现功能的叠加。
/*
* 具体构建角色,也就是被装饰的类
*/
public class BlackCoffee implements Coffee{
@Override
public String drink() {
return "纯咖啡";
}
}
/*
* 抽象装饰者角色,持有具体构建者的引用
*/
public class Decorator implements Coffee{
private Coffee coffee;
public Decorator(Coffee coffee){
this.coffee = coffee;
}
@Override
public String drink() {
return coffee.drink();
}
}
两个具体的装饰功能类
/*
* 具体装饰角色,实现增强的功能
*/
public class MilkBlackCoffee extends Decorator{
public MilkBlackCoffee(Coffee coffee){
super(coffee);
}
@Override
public String drink() {
return super.drink()+"加奶";
}
}
/*
* 具体装饰角色,实现增强的功能
*/
public class SugarBlackCoffee extends Decorator{
public SugarBlackCoffee(Coffee coffee){
super(coffee);
}
@Override
public String drink() {
return super.drink()+"加糖";
}
}
通过不同功能之间的对象传递,就可以实现功能的叠加。