重新認識裝飾模式--裝飾模式實現AOP
阿新 • • 發佈:2019-02-06
執行結果:package itcast.test.decorator; /** * 裝飾器的介面,需要和被裝飾的物件實現同樣的介面*/ public abstract class Dercorator implements GoodsSaleEbi { /** * 持有被裝飾的元件物件*/ protected GoodsSaleEbi ebi; /** * 通過構造方法傳入被裝飾物件 * @prara, ebi被裝飾的物件*/ public Dercorator(GoodsSaleEbi ebi){ this.ebi=ebi; } } package itcast.test.decorator; public class CheckDecorator extends Dercorator{ /** * 實現許可權控制*/ public CheckDecorator(GoodsSaleEbi ebi){ super(ebi); } public boolean sale(String user,String customer,SaleModel saleModel){ //簡單點兒,只讓張三執行這個功能 if(!"張三".equals(user)){ System.out.println("對不起"+user+",你沒有儲存銷售單的許可權"); //就不用再呼叫被裝飾的物件的功能了 return false; }else{ return this.ebi.sale(user,customer,saleModel); } } } package itcast.test.decorator; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; public class LogDercorator extends Dercorator{ public LogDercorator(GoodsSaleEbi ebi){ super(ebi); } public boolean sale(String user,String customer,SaleModel saleModel){ //執行業務功能 boolean f= this.ebi.sale(user, customer, saleModel); //執行業務功能後記錄日誌 DateFormat df= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS"); System.out.println("日誌記錄:"+user+"於"+df.format(new Date())+"時儲存了一條銷售記錄,客戶是"+customer+",購買記錄是"+saleModel); return f; } } package itcast.test.decorator; //商品銷售管理的業務介面 public interface GoodsSaleEbi { /* * 儲存銷售資訊 * @param customer 客戶 * @param saleModel 銷售資料 * @return 是否儲存成功*/ public boolean sale(String user,String customer,SaleModel saleModel); } package itcast.test.decorator; public class GoodsSaleEbo implements GoodsSaleEbi { @Override public boolean sale(String user, String customer, SaleModel saleModel) { System.out.println(user+"儲存了"+customer+"購買"+saleModel+"的銷售資料"); return true; } } package itcast.test.decorator; /** * 封裝好的銷售單資料物件*/ public class SaleModel { private String goods; private int saleNum; public String getGoods() { return goods; } public void setGoods(String goods) { this.goods = goods; } public int getSaleNum() { return saleNum; } public void setSaleNum(int saleNum) { this.saleNum = saleNum; } public String toString(){ return "商品名稱="+goods+",購買數量="+saleNum; } } package itcast.test.decorator; public class Client { public static void main(String[] args){ //得到業務介面,組合裝飾器 GoodsSaleEbi ebi = new CheckDecorator(new LogDercorator(new GoodsSaleEbo())); /*準備測試資料*/ SaleModel saleModel= new SaleModel(); saleModel.setGoods("MoTo 手機"); saleModel.setSaleNum(2); //呼叫和業務功能 ebi.sale("張三", "張三丰", saleModel); ebi.sale("李四", "張三丰", saleModel); } }