装饰者模式:
目的:
动态的给一个对象添加一些额外的职责。
加增加功能来说,Decorator模式相比生成子类更为灵活。该模式以对客户端透明的方式扩展对象的功能。
适用环境:
类图:
代码实现:
场景:一家豆浆店,可以在豆浆中添加不同的配料,如鸡蛋、黑豆、糖
豆浆:被装饰者。鸡蛋、黑豆、糖:就是装饰者
具体代码实现:
1.被装饰者的接口: 饮品接口(Drink.java)
package com.lemon.decorator;
/**
* 顶层接口 计算价格
* 被装饰者的接口: 饮料接口
* @author lemonSun
*
* 2019年5月8日下午4:21:56
*/
public interface Drink {
float cost(); //计算价格
String description(); //描述
}
2.具体被装饰者类:豆浆soyBeanMilkDrink.java
package com.lemon.decorator;
/**
* 具体被装饰者类:豆浆
* @author lemonSun
*
* 2019年5月8日下午4:27:03
*/
public class soyBeanMilkDrink implements Drink{
@Override
public float cost() {
return 10f;
}
@Override
public String description() {
return "纯豆浆";
}
}
3.装饰者基类: 继承Drink 可以装饰任何饮品Decorator
package com.lemon.decorator;
/**
* 装饰者基类: 继承Drink 可以装饰任何饮品
* @author lemonSun
*
* 2019年5月8日下午4:29:51
*/
public abstract class Decorator implements Drink{
private Drink drink; //要装饰的对象
public Decorator(Drink drink) {
this.drink = drink;
}
@Override
public float cost() {
return drink.cost();
}
@Override
public String description() {
return drink.description();
}
}
4.具体的装饰者类: 黑豆BlackBeanDecorator
package com.lemon.decorator;
/**
* 具体的装饰者类: 加黑豆
* @author lemonSun
*
* 2019年5月8日下午5:52:44
*/
public class BlackBeanDecorator extends Decorator {
public BlackBeanDecorator(Drink drink) {
super(drink);
}
@Override
public float cost() {
return super.cost()+2.0f; //加上黑豆价格
}
@Override
public String description() {
return super.description() + "+黑豆"; //加上黑豆描述
}
}
5.具体的装饰者类: 鸡蛋EggDecorator
package com.lemon.decorator;
/**
* 具体的装饰者类: 加鸡蛋
* @author lemonSun
*
* 2019年5月8日下午5:52:44
*/
public class EggDecorator extends Decorator {
public EggDecorator(Drink drink) {
super(drink);
}
@Override
public float cost() {
return super.cost()+3.0f; //加上鸡蛋的价格
}
@Override
public String description() {
return super.description() + "+鸡蛋"; //加上鸡蛋的描述
}
}
6.具体的装饰者类: 糖SugarDecorator
package com.lemon.decorator;
/**
* 具体的装饰者类: 加糖
* @author lemonSun
*
* 2019年5月8日下午5:52:44
*/
public class SugarDecorator extends Decorator {
public SugarDecorator(Drink drink) {
super(drink);
}
@Override
public float cost() {
return super.cost()+1.0f; //加上糖的价格
}
@Override
public String description() {
return super.description() + "+糖"; //加上糖的描述
}
}
7.测试Test:
package com.lemon.decorator;
public class Test {
public static void main(String[] args) {
//新建豆浆
Drink drink = new soyBeanMilkDrink();
//加入鸡蛋
EggDecorator egg = new EggDecorator(drink);
//再加入黑豆
BlackBeanDecorator bbd = new BlackBeanDecorator(egg);
//再加入糖
SugarDecorator sd = new SugarDecorator(bbd);
System.out.println("您点的饮品是:" + sd.description());
System.out.println("应付金额为:" + sd.cost());
}
}