1. 程式人生 > >重新認識裝飾模式--裝飾模式實現AOP

重新認識裝飾模式--裝飾模式實現AOP

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);
        
    }
}
執行結果: