//計算獎金的組件接口
public abstract class Component{ 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; //持有被裝飾的組件對象 public Decorator(Component c){this.c = c;}public double calcPrize(String user, Date begin, Date end){//轉調組件對象的方法return c.calcPrize(user, begin, end);}}//月獎金:團隊業務
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 MonthPrizeDecorator extends Decorator{...
}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);}}
1.1. 對象組合
public class A{public void a1(){System.out.println("now in A.a1");}}public class C2{//創建A對象的實例 private A a = new A(); public void a1(){//轉調A對象的功能a.a1();}public void c11(){System.out.println("now in C2.c11");}}