Decator定义:动态的给一个类添加一些职责
Beverage 是抽象组件,HouseBlend是具体组件
Decorator 是装饰器组件,Milk为具体装饰器
package org.savior.decorator;
abstract class Beverage {
abstract String getDescription();
abstract double getCost();
}
class HouseBlend extends Beverage{
@Override
double getCost() {
return 10.00;
}
@Override
String getDescription() {
return "HouseBlend咖啡";
}
}
class Espresson extends Beverage{
@Override
double getCost() {
return 20.00;
}
@Override
String getDescription() {
return "Espresson咖啡";
}
}
class Decorator extends Beverage{
private Beverage beverage;
public Decorator(Beverage beverage){
this.beverage = beverage;
}
@Override
double getCost() {
return beverage.getCost();
}
@Override
String getDescription() {
return beverage.getDescription();
}
}
class Milk extends Decorator{
public Milk(Beverage beverage) {
super(beverage);
}
double getCost() {
double cost = super.getCost();
return cost + 2.0;
}
String getDescription() {
String des = super.getDescription();
return des + "加牛奶";
}
}
class Mocha extends Decorator{
public Mocha(Beverage beverage) {
super(beverage);
}
double getCost() {
double cost = super.getCost();
return cost + 5.0;
}
String getDescription() {
String des = super.getDescription();
return des + "加摩卡";
}
}
class Client{
public static void main(String[] args) {
Beverage b = new HouseBlend();
Decorator d = new Mocha(b);
System.out.println(d.getCost());
System.out.println(d.getDescription());
}
}
Beverage 是抽象组件,HouseBlend是具体组件
Decorator 是装饰器组件,Milk为具体装饰器
package org.savior.decorator;
import java.util.*;
public class Price {
public static void main(String[] args) {
Component c = new ConcreteComponent();
prizeDecorator p = new GroupPrizeDecorator(c);
System.out.println(p.calPrize("王五"));
}
}
/**
* 测试数据
*/
class TempDB{
public static Map<String,Double> map = new HashMap<String,Double>();
static{
map.put("张三", 1000.0);
map.put("李四", 2000.0);
map.put("王五", 3000.0);
}
}
/**
* 计算奖金的组件接口
*/
abstract class Component{
/**
* 奖金计算方法
* @param user
* @return
*/
public abstract double calPrize(String user);
}
class ConcreteComponent extends Component{
public double calPrize(String user) {
return 0;
}
}
abstract class prizeDecorator extends Component{
/*
* 被装饰的组件对象
*/
private Component component;
public prizeDecorator(Component component){
this.component = component;
}
public double calPrize(String user){
/*
* 转掉组件的对象方法
*/
return component.calPrize(user);
}
}
class GroupPrizeDecorator extends prizeDecorator{
public GroupPrizeDecorator(Component component) {
super(component);
}
public double calPrize(String user){
double money = super.calPrize(user);
double group = 0.0;
for(double d : TempDB.map.values()){
group += d;
}
return money + group;
}
}