java模式之装饰模式

1. 什么叫装饰模式?

根据业务的需求,需要对一个类的方法进行增强的处理。

 

2. 为什么需要装饰模式?

拓展性更加的好,当觉得这个装饰不好的时候,可以直接拿下,不需要改变任何的代码。

 

3. 装饰模式的一个具体的应用?   电子发票系统

代码:

package com.huxin.decorator.test;
import java.util.Date;
import java.util.Vector;

abstract public class Order {
    private String name;
    private Date date ;
    private Vector itemsLinelist  = new Vector(10);
    public Order(){
    	System.out.println("调用order的构造方法");
    }
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	public double getTotalPrice() {
		double price = 0.0d;
		for(int i =0 ;i<itemsLinelist.size();i++){
			ItemsLine itemsLine = (ItemsLine)itemsLinelist.get(i);
			price +=itemsLine.getSubTotalPrice();
		}
		return price;
	}
	public void addItems(ItemsLine itemsLine){
		itemsLinelist.add(itemsLine);
    }
     
	public void removeItems(ItemsLine itemsLine){
		itemsLinelist.remove(itemsLine);
	}
	public void print(){
System.out.println("order==================================================");
		for(int i =0 ;i<itemsLinelist.size();i++){
			ItemsLine itemsLine = (ItemsLine)itemsLinelist.get(i);
			itemsLine.print();
		}
	}
}


 

package com.huxin.decorator.test;

public class SalsOrder extends Order {
   public SalsOrder(){
	  System.out.println("调用SalsOrder的构造方法");
   }
   public void print(){
	   super.print();
   }
}


 

package com.huxin.decorator.test;

public class ItemsLine {
    private String itemsName;
    private double unit ;
    private int number;
    private double subTotalPrice;
	public String getItemsName() {
		return itemsName;
	}
	public void setItemsName(String itemsName) {
		this.itemsName = itemsName;
	}
	
	public double getUnit() {
		return unit;
	}
	public void setUnit(double unit) {
		this.unit = unit;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public double getSubTotalPrice() {
		return number * unit;
	}
	public void print(){
		System.out.println("购买商品的名字为:"+ itemsName+ "单价为:"+ unit+ "数量为"+ number);
	}
}


 

package com.huxin.decorator.test;

abstract public class AbstractDecorator extends Order{
   protected Order order; 
   //装饰类必须接受这个order对象
   public AbstractDecorator(Order order){
	   this.order = order;
	   this.setDate(order.getDate());
	   this.setName(order.getName());
   }
   public void print(){
	   super.print();
   }
}


 

package com.huxin.decorator.test;

public class FootDecorator extends AbstractDecorator {
	   //装饰类必须接受这个order对象
	   public FootDecorator(Order order){
          super(order);
System.out.println("我后被创建FootDecorator");
	   }
	   public void print(){
		   order.print();
		   printFooter();
	   }
	   public void printFooter(){
System.out.println("foot==================================================");
		   System.out.println("总价格为:"+ super.order.getTotalPrice());
	   }
}


 

package com.huxin.decorator.test;

public class HeaderDecorator extends AbstractDecorator {
	   //装饰类必须接受这个order对象
	   public HeaderDecorator(Order order){
		  super(order);
System.out.println("我先被创建HeaderDecorator");
	   }
	   public void print(){
		   printHeader();
		   super.order.print();
	   }
	   public void printHeader(){
System.out.println("header==================================================");
		   System.out.println("顾客的姓名为:"+ super.order.getName() +"日期为:"+ super.order.getDate());
	   }
}


 

package com.huxin.decorator.test;

import java.util.Date;

public class Client {
	private static Order order;
	public static void main(String[] args) {
		
		
	   order = new SalsOrder();

	   ItemsLine itemsLine = new ItemsLine();
	   itemsLine.setItemsName("杯子");
	   itemsLine.setUnit(8.0d);
	   itemsLine.setNumber(1);
	   

	   ItemsLine itemsLine2 = new ItemsLine();
	   itemsLine2.setItemsName("疯狂java");
	   itemsLine2.setUnit(610d);
	   itemsLine2.setNumber(2);
	   
	   order.addItems(itemsLine2);
	   order.addItems(itemsLine);
	   
	   order.setDate(new Date());
	   order.setName("胡鑫");
	   order= new HeaderDecorator(new FootDecorator(order));
	   order.print();
	}
}


 

 

 

 

posted @ 2013-07-01 20:03  坚固66  阅读(137)  评论(0编辑  收藏  举报