装饰着模式涉及的角色
抽象构建角色:定义一个抽象接口,来规范准备附加功能的类
具体构件角色:将要被附加功能的类,实现抽象构件角色接口
抽象装饰者角色:持有对具体构件角色的引用并定义与抽象角色一致的接口
具体装饰角色:实现抽象装饰者角色,负责为具体构件添加额外的功能。
例如有如下场景,卖饮料,可以是酸梅汤,豆浆等。假如纯豆浆(soya)卖五元,现在有三种配料,鸡蛋,糖,黑豆,都可以组合,可以是鸡蛋+豆浆+黑豆,也可以是豆浆加黑豆,各种组合,假如说每一种做法都要写一个类的话,那得需要写很多,会造成类爆炸。
这时装饰者模式就派上用场,
1)因为所有方法的豆浆都属于饮料,所以我先设计一个被装饰的接口Drink类,后期可以定义卖豆浆,卖酸梅汤
2)SoyaBeanMilk 这是具体的被装饰着对象,属于被装饰着,后面的黑豆糖属于装饰着
3)定义一个黑豆、糖、豆浆的装饰着基类,所有类都继承于它,在里面设定各种方法,此场景下设计describe和cost两个方法
4)定义 EggDecorator,SugarDecorator,BlackBeanDecorator,属于具体的装饰着对象,继承与装饰者基类
5)test类,负责具体的操作
装饰者模式的实现
1)具体类
Drink 被装饰者对象的接口
SoyaBeanMilk.java 具体的被装饰者对象
EggDecorator 具体装饰者对象
SugarDecorator.java 具体装饰者对象
BlackBeanDecorator.java 具体装饰者对象
Decorator.java 装饰者基类
Test.java 测试
2)代码如下
被装饰者装饰的接口
public interface Drink_decorator {
//饮料的描述信息
public String description();
//计算价格
public float cost();
}
//具体的被装饰者对象,豆浆是饮料,需要实现饮料的接口
public class SoyaBeanMilk implements Drink_decorator{
@Override
public String description() {
// TODO Auto-generated method stub
return "纯豆浆";
}
@Override
public float cost() {
// TODO Auto-generated method stub
return 5f;
}
}
装饰者基类,关联Drink
public abstract class Decorator implements Drink_decorator{
private Drink_decorator drink;//要装饰的对象
public Decorator(Drink_decorator drink) {
// TODO Auto-generated constructor stub
this.drink=drink;
}
@Override
public String description() {
// TODO Auto-generated method stub
return drink.description();
}
@Override
public float cost() {
// TODO Auto-generated method stub
return drink.cost();
}
}
具体的装饰者对象,黑豆
public class BlackBeanDecorator extends Decorator{
public BlackBeanDecorator(Drink_decorator drink) {
super(drink);
// TODO Auto-generated constructor stub
}
@Override
public String description() {
// TODO Auto-generated method stub
return super.description()+"黑豆";
}
@Override
public float cost() {
// TODO Auto-generated method stub
return super.cost()+1f;
}
}
具体的装饰者对象 鸡蛋
public class EggDecorator extends Decorator{
public EggDecorator(Drink_decorator drink) {
super(drink);
// TODO Auto-generated constructor stub
}
@Override
public String description() {
// TODO Auto-generated method stub
return super.description()+"鸡蛋";
}
@Override
public float cost() {
// TODO Auto-generated method stub
return super.cost()+2f;
}
}
具体的装饰着对象,糖的装饰者对象
public class SugarDecorator extends Decorator{
public SugarDecorator(Drink_decorator drink) {
super(drink);
// TODO Auto-generated constructor stub
}
@Override
public String description() {
// TODO Auto-generated method stub
return super.description()+"糖";
}
@Override
public float cost() {
// TODO Auto-generated method stub
return super.cost()+0.5f;
}
}
测试类
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//生产一杯豆浆
Drink_decorator soya=new SoyaBeanMilk();
//在豆浆中加鸡蛋
EggDecorator eggsoya=new EggDecorator(soya);
//在加了鸡蛋的豆浆中加糖
SugarDecorator sugar=new SugarDecorator(eggsoya);
//在加了糖加了鸡蛋的豆浆中假如黑豆
BlackBeanDecorator blackBeanDecorator=new BlackBeanDecorator(sugar);
//结账
System.out.println("您点的是:"+blackBeanDecorator.description());
System.out.println("您一共消费了多少钱:"+blackBeanDecorator.cost()+"元");
}
}
结果
您点的是:纯豆浆鸡蛋糖黑豆
您一共消费了多少钱:8.5元