日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

《研磨设计模式》chap22 装饰模式Decorator(2)应用到场景

發(fā)布時(shí)間:2025/3/21 asp.net 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《研磨设计模式》chap22 装饰模式Decorator(2)应用到场景 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


//計(jì)算獎(jiǎng)金的組件接口 public abstract class Component { public abstract double calcPrize(String user,Date begin,Date end); }//基本的實(shí)現(xiàn)計(jì)算獎(jiǎng)金的類,也是被裝飾器裝飾的對(duì)象 public class ConcreteComponent extends Component{ public double calcPrize(String user, Date begin, Date end) {//只是一個(gè)默認(rèn)的實(shí)現(xiàn),默認(rèn)沒(méi)有獎(jiǎng)金return 0;} }public abstract class Decorator extends Component{ protected Component c; //持有被裝飾的組件對(duì)象 public Decorator(Component c){this.c = c;} public double calcPrize(String user, Date begin, Date end) {//轉(zhuǎn)調(diào)組件對(duì)象的方法return c.calcPrize(user, begin, end);} }//月獎(jiǎng)金:團(tuán)隊(duì)業(yè)務(wù) public class GroupPrizeDecorator extends Decorator{public GroupPrizeDecorator(Component c){super(c);}public double calcPrize(String user, Date begin, Date end) {//1:先獲取前面運(yùn)算出來(lái)的獎(jiǎng)金double money = super.calcPrize(user, begin, end);//2:然后計(jì)算當(dāng)月團(tuán)隊(duì)業(yè)務(wù)獎(jiǎng)金,先計(jì)算出團(tuán)隊(duì)總的業(yè)務(wù)額,然后再乘以1%//假設(shè)都是一個(gè)團(tuán)隊(duì)的double group = 0.0;for(double d : TempDB.mapMonthSaleMoney.values()){group += d;}double prize = group * 0.01;System.out.println(user+"當(dāng)月團(tuán)隊(duì)業(yè)務(wù)獎(jiǎng)金"+prize);return money + prize;} }//月獎(jiǎng)金:業(yè)務(wù) public class MonthPrizeDecorator extends Decorator{... }public class Client {public static void main(String[] args) {//先創(chuàng)建計(jì)算基本獎(jiǎng)金的類,這也是被裝飾的對(duì)象Component c1 = new ConcreteComponent();//然后對(duì)計(jì)算的基本獎(jiǎng)金進(jìn)行裝飾,這里要組合各個(gè)裝飾//說(shuō)明,各個(gè)裝飾者之間最好是不要有先后順序的限制,也就是先裝飾誰(shuí)和后裝飾誰(shuí)都應(yīng)該是一樣的//先組合普通業(yè)務(wù)人員的獎(jiǎng)金計(jì)算Decorator d1 = new MonthPrizeDecorator(c1);Decorator d2 = new SumPrizeDecorator(d1); //注意:這里只需要使用最后組合好的對(duì)象調(diào)用業(yè)務(wù)方法即可,會(huì)依次調(diào)用回去//日期對(duì)象都沒(méi)有用上,所以傳null就可以了double zs = d2.calcPrize("張三",null,null); System.out.println("==========張三應(yīng)得獎(jiǎng)金:"+zs);double ls = d2.calcPrize("李四",null,null);System.out.println("==========李四應(yīng)得獎(jiǎng)金:"+ls);//如果是業(yè)務(wù)經(jīng)理,還需要一個(gè)計(jì)算團(tuán)隊(duì)的獎(jiǎng)金計(jì)算Decorator d3 = new GroupPrizeDecorator(d2);double ww = d3.calcPrize("王五",null,null);System.out.println("==========王經(jīng)理應(yīng)得獎(jiǎng)金:"+ww); } }

1.1. 對(duì)象組合

public class A {public void a1(){System.out.println("now in A.a1");} }public class C2 {//創(chuàng)建A對(duì)象的實(shí)例 private A a = new A(); public void a1(){//轉(zhuǎn)調(diào)A對(duì)象的功能a.a1();}public void c11(){System.out.println("now in C2.c11");} }

1.2.初步總結(jié)

裝飾器中不僅僅是可以給被裝飾對(duì)象增加功能,還可以根據(jù)需要選擇是否調(diào)用被裝飾對(duì)象的功能,如果不調(diào)用被裝飾對(duì)象的功能,那就變成完全重新實(shí)現(xiàn)了,相當(dāng)于動(dòng)態(tài)修改了被裝飾對(duì)象的功能。
延伸另外一點(diǎn),各個(gè)裝飾器之間最好是完全獨(dú)立的功能,不要有依賴,這樣在進(jìn)行裝飾組合的時(shí)候,才沒(méi)有先后順序的限制.

總結(jié)

以上是生活随笔為你收集整理的《研磨设计模式》chap22 装饰模式Decorator(2)应用到场景的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。