装饰器模式


import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public abstract class Order {
	
	protected List<OrderLine> items = new ArrayList<OrderLine>(10);
	
	protected String customerName;
	protected Date salesDate;
	
	private double total;
	
	public void addItem(OrderLine orderLine){
		items.add(orderLine);
	}
	public void removeItem(OrderLine orderLine){
		items.remove(orderLine);
	}
	public void print(){
		for(OrderLine orderLine : items){
			orderLine.printLine();
		}
	}
	
	public double getGrandTotal(){
		double amount = 0.0D;
		for(OrderLine orderLine : items){
			amount += orderLine.getSubtotal();
		}
		return amount;
	}
	
	public String getCustomerName() {
		return customerName;
	}
	public void setCustomerName(String customerName) {
		this.customerName = customerName;
	}
	public Date getSalesDate() {
		return salesDate;
	}
	public void setSalesDate(Date salesDate) {
		this.salesDate = salesDate;
	}
	public double getTotal() {
		return total;
	}
	public void setTotal(double total) {
		this.total = total;
	}
	
	
}

public class OrderLine {
	private String itemName;
	private int units;
	private double unitPrice;

	public void printLine(){
		System.out.println(itemName + "\t" + 
							units + "\t" + 
							formatCurrency(unitPrice) + "\t\t" +
							formatCurrency(getSubtotal()) + "\t"
							);
	}
	
	public double getSubtotal(){
		return unitPrice * units;
	}
	public String getItemName() {
		return itemName;
	}
	public void setItemName(String itemName) {
		this.itemName = itemName;
	}
	public int getUnits() {
		return units;
	}
	public void setUnits(int units) {
		this.units = units;
	}
	public double getUnitPrice() {
		return unitPrice;
	}
	public void setUnitPrice(double unitPrice) {
		this.unitPrice = unitPrice;
	}
	private String formatCurrency(double amount) {
		return NumberFormat.getCurrencyInstance().format(amount);
	}
}

public class SalesOrder extends Order{
	public SalesOrder() {
		// TODO Auto-generated constructor stub
	}
	public void print(){
		super.print();
	}
}

public abstract class OrderDecorator extends Order{
	
	protected Order order;
	
	public OrderDecorator(Order order) {
		this.order = order;
		this.setCustomerName(order.getCustomerName());
		this.setSalesDate(order.getSalesDate());
	}
	
	@Override
	public void print(){
		super.print();
	}
	
}

public class HeaderOrderDecorator extends OrderDecorator{
	
	public HeaderOrderDecorator(Order order) {
		super(order);
	}
	
	@Override
	public void print(){
		printHeader();
		super.order.print();
	}
	
	public void printHeader() {
		System.out.println("\t******\tINVOICE\t*******");
		System.out.println(super.order.getCustomerName());
		System.out.println("Date of Sale:");
		System.out.println(super.order.getSalesDate());
		System.out.println("=================header==========================");
		System.out.println("item\t\tUnits\tUnit Price\tSubtotal");
	}
}

public class FooterOrderDecorator extends OrderDecorator{

	public FooterOrderDecorator(Order order) {
		super(order);
	}
	
	@Override
	public void print() {
		super.order.print();
		printFooter();
	}
	
	public void printFooter() {
		System.out.println("=================footer=======================");
		System.out.println("Total\t\t\t\\t"+super.order.getGrandTotal());
	}
}

public class Clinet {
	private static Order order;
	public static void main(String[] args) {
		order = new SalesOrder();
		order.setSalesDate(new Date());
		order.setCustomerName("XYZ Repaiz Shop");
		
		OrderLine line1 = new OrderLine();
		line1.setItemName("FireWheel Tire");
		line1.setUnitPrice(1543.23);
		line1.setUnits(5);
		order.addItem(line1);
		
		OrderLine line2 = new OrderLine();
		line2.setItemName("Front Fender");
		line2.setUnitPrice(300.23);
		line2.setUnits(1);
		order.addItem(line2);
		
//		order = new HeaderOrderDecorator(
//				new FooterOrderDecorator(order));
		order = new HeaderOrderDecorator(new FooterOrderDecorator(order));
		order.print();
	}
}

你可能感兴趣的:(装饰器模式)