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