设计模式 - 装饰器模式

Decator定义:动态的给一个类添加一些职责

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

猜你喜欢

转载自saviorzuo.iteye.com/blog/1827451