91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中的裝飾模式怎么用

發布時間:2021-07-24 10:50:04 來源:億速云 閱讀:126 作者:chen 欄目:大數據

這篇文章主要介紹“java中的裝飾模式怎么用”,在日常操作中,相信很多人在java中的裝飾模式怎么用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”java中的裝飾模式怎么用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1. 模式的定義

如何實現靈活的獎金計算?假設獎金的計算體系如下:

  • 每個人當月業務獎金:當月銷售額 * 3%

  • 每個人累計獎金:總的回款額 * 0.1%

  • 團隊獎金:團隊總銷售額 * 1%

獎金計算面臨的問題: 
1. 計算邏輯復雜 
2. 要有靈活性,可以方便地增加或者減少功能 
3. 動態組合計算,不同的人參與的計算不同

抽象出來的問題:如何才能透明地給一個對象增加功能,并實現功能的動態組合?

裝飾模式的定義: 
動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。

2. UML圖

java中的裝飾模式怎么用 
Component:組件對象的接口,可以給這些對象動態地添加職責

ConcreteComponent:具體的組件對象,實現組件接口,通常是被裝飾器裝飾的原始對象,也就是可以給這個對象添加職責

Decorator:所有裝飾器的抽象父類,需要定義一個與組件接口一致的接口,并持有一個Component對象,其實就是持有一個被裝飾的對象

ConcreteDecorator:具體的裝飾器對象,實現具體要向被裝飾對象添加的功能

代碼:

/**

 * 在內存中模擬數據庫,準備點測試數據,好計算獎金

 */public class TempDB {

    private TempDB(){}    /**

     * 記錄每個人的月度銷售額,只用了人員,月份沒有用

     */

    public static Map<String,Double> mapMonthSaleMoney = new HashMap<String,Double>();    static{        //填充測試數據

        mapMonthSaleMoney.put("張三",10000.0);

        mapMonthSaleMoney.put("李四",20000.0);

        mapMonthSaleMoney.put("王五",30000.0);

    }

}/**

 * 計算獎金的組件接口

 */public abstract class Component {

    /**

     * 計算某人在某段時間內的獎金,有些參數在演示中并不會使用,

     * 但是在實際業務實現上是會用的,為了表示這是個具體的業務方法,

     * 因此這些參數被保留了

     * @param user 被計算獎金的人員

     * @param begin 計算獎金的開始時間

     * @param end 計算獎金的結束時間

     * @return 某人在某段時間內的獎金

     */

    public abstract double calcPrize(String user,Date begin,Date end);

}/**

 * 基本的實現計算獎金的類,也是被裝飾器裝飾的對象

 */public class ConcreteComponent extends Component{


    public double calcPrize(String user, Date begin, Date end) {        //只是一個默認的實現,默認沒有獎金

        return 0;

    }

}/**

 * 裝飾器的接口,需要跟被裝飾的對象實現同樣的接口

 */public abstract class Decorator extends Component{

    /**

     * 持有被裝飾的組件對象

     */

    protected Component c;    /**

     * 通過構造方法傳入被裝飾的對象

     * @param c被裝飾的對象

     */

    public Decorator(Component c){        this.c = c;

    }    public double calcPrize(String user, Date begin, Date end) {        //轉調組件對象的方法

        return c.calcPrize(user, begin, end);

    }

}/**

 * 裝飾器對象,計算當月業務獎金

 */public class MonthPrizeDecorator extends Decorator{

    public MonthPrizeDecorator(Component c){        super(c);

    }    public double calcPrize(String user, Date begin, Date end) {        //1:先獲取前面運算出來的獎金

        double money = super.calcPrize(user, begin, end);        //2:然后計算當月業務獎金,按照人員和時間去獲取當月的業務額,然后再乘以3%

        double prize = TempDB.mapMonthSaleMoney.get(user) * 0.03;

        System.out.println(user+"當月業務獎金"+prize);        return money + prize;

    }


}/**

 * 裝飾器對象,計算累計獎金

 */public class SumPrizeDecorator extends Decorator{

    public SumPrizeDecorator(Component c){        super(c);

    }    public double calcPrize(String user, Date begin, Date end) {        //1:先獲取前面運算出來的獎金

        double money = super.calcPrize(user, begin, end);        //2:然后計算累計獎金,其實這里應該按照人員去獲取累計的業務額,然后再乘以0.1%

        //簡單演示一下,假定大家的累計業務額都是1000000元

        double prize = 1000000 * 0.001;

        System.out.println(user+"累計獎金"+prize);        return money + prize;

    }


}/**

 * 裝飾器對象,計算當月團隊業務獎金

 */public class GroupPrizeDecorator extends Decorator{

    public GroupPrizeDecorator(Component c){        super(c);

    }    public double calcPrize(String user, Date begin, Date end) {        //1:先獲取前面運算出來的獎金

        double money = super.calcPrize(user, begin, end);        //2:然后計算當月團隊業務獎金,先計算出團隊總的業務額,然后再乘以1%

        //假設都是一個團隊的

        double group = 0.0;        for(double d : TempDB.mapMonthSaleMoney.values()){

            group += d;

        }        double prize = group * 0.01;

        System.out.println(user+"當月團隊業務獎金"+prize);        return money + prize;

    }


}/**

 * 使用裝飾模式的客戶端

 */public class Client {

    public static void main(String[] args) {        //先創建計算基本獎金的類,這也是被裝飾的對象

        Component c1 = new ConcreteComponent();        //然后對計算的基本獎金進行裝飾,這里要組合各個裝飾

        //說明,各個裝飾者之間最好是不要有先后順序的限制,也就是先裝飾誰和后裝飾誰都應該是一樣的



        //一層一層疊加的功能

        //先組合普通業務人員的獎金計算

        Decorator d1 = new MonthPrizeDecorator(c1);

        Decorator d2 = new SumPrizeDecorator(d1);   


        //注意:這里只需要使用最后組合好的對象調用業務方法即可,會依次調用回去

        //日期對象都沒有用上,所以傳null就可以了

        double zs = d2.calcPrize("張三",null,null);       

        System.out.println("==========張三應得獎金:"+zs);        double ls = d2.calcPrize("李四",null,null);

        System.out.println("==========李四應得獎金:"+ls);        //如果是業務經理,還需要一個計算團隊的獎金計算

        Decorator d3 = new GroupPrizeDecorator(d2);        double ww = d3.calcPrize("王五",null,null);

        System.out.println("==========王經理應得獎金:"+ww);


    }

}

3. 研磨設計模式

1)裝飾模式的功能:實現動態地為對象添加功能,一層一層的包裝

2)類功能的擴展:1. 繼承 2.對象的組合

3)Java中的裝飾模式:IO流 
java中的裝飾模式怎么用

  • InputStream相當于Component

  • FileInputStream,ObjectInputStream,StringBufferInputStream相當于ConcreteComponent

  • FilterInputStream相當于Decorator

  • DataInputStream,BufferedInputStream相當于ConcreteDecorator

4)裝飾器模式與AOP 
AOP為開發者提供了一種描述橫切關注點的機制,并能夠自動將橫切關注點植入到面向對象的軟件系統中,從而實現了橫切關注點的模塊化。 
java中的裝飾模式怎么用 
AOP能夠將那些與業務無關,卻被業務模塊所共同調用的邏輯,比如,事務處理,日志管理,權限控制,封裝起來,便于減少系統的重復代碼,降低模塊間的耦合度,利于未來的維護和操作。 
AOP一個更重要的變化是思想上的變化(主從換位),讓原本主動調用的功能模塊變成了被動等待。

/**

 * 商品銷售管理的業務接口  相當于Component

 */public interface GoodsSaleEbi {

    /**

     * 保存銷售信息,本來銷售數據應該是多條,太麻煩了,為了演示,簡單點

     * @param user 操作人員

     * @param customer 客戶

     * @param saleModel 銷售數據

     * @return 是否保存成功

     */

    public boolean sale(String user,String customer,SaleModel saleModel);

}/**

 * 封裝銷售單的數據,簡單的示意一些

 */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;

    }

}/**

 * 業務對象

 */public class GoodsSaleEbo implements GoodsSaleEbi{


    public boolean sale(String user,String customer, SaleModel saleModel) {

        System.out.println(user+"保存了"+customer+"購買 "+saleModel+" 的銷售數據");        return true;

    }

}/**

 * 裝飾器的接口,需要跟被裝飾的對象實現同樣的接口

 */public abstract class Decorator implements GoodsSaleEbi{

    /**

     * 持有被裝飾的組件對象

     */

    protected GoodsSaleEbi ebi;    /**

     * 通過構造方法傳入被裝飾的對象

     * @param ebi被裝飾的對象

     */

    public Decorator(GoodsSaleEbi ebi){        this.ebi = ebi;

    }

}/**

 * 實現權限控制

 */public class CheckDecorator extends Decorator{

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

        }       

    }

}/**

 * 實現日志記錄

 */public class LogDecorator extends Decorator{

    public LogDecorator(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;

    }


}public class Client {

    public static void main(String[] args) {        //得到業務接口,組合裝飾器

        GoodsSaleEbi ebi = new CheckDecorator(new LogDecorator(new GoodsSaleEbo()));        //準備測試數據

        SaleModel saleModel = new SaleModel();

        saleModel.setGoods("Moto手機");

        saleModel.setSaleNum(2);        //調用業務功能

        ebi.sale("張三","張三豐", saleModel);

        ebi.sale("李四","張三豐", saleModel);

    }

}

5)裝飾器模式的本質:動態組合

到此,關于“java中的裝飾模式怎么用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东光县| 柳林县| 东阿县| 嘉荫县| 永康市| 华容县| 谷城县| 德兴市| 内黄县| 东海县| 尖扎县| 遂宁市| 长乐市| 宣武区| 炎陵县| 家居| 兴业县| 新建县| 双柏县| 绥中县| 寿宁县| 和林格尔县| 宜昌市| 康定县| 海兴县| 法库县| 丰城市| 筠连县| 重庆市| 漳州市| 嘉兴市| 余干县| 玉环县| 金湖县| 晋州市| 微博| 鲁甸县| 平乐县| 图们市| 屏南县| 西华县|