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; } }