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