//计算奖金的组件接口
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");}
}

1.2.初步总结

装饰器中不仅仅是可以给被装饰对象增加功能,还可以根据需要选择是否调用被装饰对象的功能,如果不调用被装饰对象的功能,那就变成完全重新实现了,相当于动态修改了被装饰对象的功能。
延伸另外一点,各个装饰器之间最好是完全独立的功能,不要有依赖,这样在进行装饰组合的时候,才没有先后顺序的限制.

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

  1. Java私塾:研磨设计模式 之 装饰模式(Decorator)3

    22.3  模式讲解 22.3.1  认识装饰模式 (1)模式功能 装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象增加功能,相当于是改变了对象的外观.当装饰过后,从外部使用系统的角度看 ...

  2. 二十四种设计模式:装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern) 介绍 动态地给一个对象添加一些额外的职责.就扩展功能而言,它比生成子类方式更为灵活. 示例 有一个Message实体类,某个对象对它的操作有Insert ...

  3. 《研磨设计模式》chap22 装饰模式Decorator(4)AOP+总结

    1. AOP面向方面编程 共性功能 AOP调用示意图 public class SaleModel { private String goods; //销售的商品 public String getG ...

  4. 《研磨设计模式》chap22 装饰模式Decorator(1)模式简介

    场景:算员工奖金,各种奖金,有个人销售奖,团队奖,环比增加销售奖等等 1. 正常编码 public class Prize {//计算某人在某段时间内的奖金,有些参数在演示中并不会使用, public ...

  5. 《研磨设计模式》chap22 装饰模式Decorator(3)I/O流

    1.1 public class IOTest {public static void main(String[] args)throws Exception {//流式读取文件DataInputSt ...

  6. 设计模式之装饰模式(Decorator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  7. 设计模式之装饰模式(Decorator)

    目录 前言 Decorator设计模式 解决的问题 案例:流操作的扩展 模式定义 结构 要点总结 前言 在学习侯捷老师的有关设计模式的课程(李建忠老师主讲)中,老师对23种设计模式的有自己的划分,如下 ...

  8. c语言装饰,C++设计模式之装饰模式(Decorator)

    装饰模式是一种经典的类功能扩展模式,其精髓在装饰类使用继承加聚合的方式获得接口和要实现对象,然后通过自己实现扩展接口 作用装饰模式通过装饰类动态地将责任附加到对象上,若要扩展功能,无需通过继承增加子类 ...

  9. 研磨设计模式之 装饰模式-3

    3  模式讲解 3.1  认识装饰模式 (1)模式功能         装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象增加功能,相当于是改变了对象的外观.当装饰过后,从外部使用系统的角 ...

最新文章

  1. 面试官问我:什么是高并发下的请求合并?
  2. 怎样在Ubuntu 14.04中安装Java
  3. oralce 11g data guard
  4. 所有IT人的大恩人永远的离开了
  5. 用计算机模拟实验技术路线,自然科学基金申请书模板
  6. In-App Purchase 实战
  7. 现代工程制图及计算机辅助绘图答案,现代工程制图(附习题集第2版高等学校应用型特色规划教材)...
  8. linux如何监控网络流量,linux 下网络流量监控
  9. 百度翻译API教程(完整Android代码)
  10. bat文件的@echo off是什么作用?
  11. DHTML Cascading style sheet 下载 CSS手册
  12. 四川一度智信:如何做好电商?
  13. Seaweedfs的安装和使用--研究
  14. 软件配置管理中三个基线概念
  15. 基于Ubuntu 16.04的HUSTOJ在线判题系统的搭建
  16. 基于BIM的工程建设智慧管理解决方案
  17. unity材质球属性无法修改
  18. 2022-7-7 Leetcode 844.比较含退格的字符串
  19. 【shell附加课】shell脚本调试方案详解
  20. 【漏洞修复】自定义实现的X509TrustManager子类中..

热门文章

  1. vue 在进入某一个页面的时候,created方法不执行,----亲测,通俗易懂
  2. 第九届蓝桥杯java B组—第二题方格计数(详细介绍)
  3. qt android oci数据库,QT mysql SQLite 数据库支持
  4. int 为什么是2147483647_2147483647代表什么
  5. 开启ntp服务_Linux入门:Linux自有服务及软件包
  6. 数据中心成为生态系统向绿色氢经济转变的催化剂
  7. 数据中心虚拟化的8大好处
  8. 数据中心运维人的半衰期危机
  9. Ubuntu之bashrc:成功解决Ubuntu系统内出现的conda:未找到命令
  10. Paper:《Multimodal Machine Learning: A Survey and Taxonomy,多模态机器学习:综述与分类》翻译与解读