1. AOP面向方面编程

共性功能

AOP调用示意图

public class SaleModel { private String goods;   //销售的商品 public String getGoods() {return goods;}public void setGoods(String goods) {this.goods = goods;}  public String toString(){return "商品名称="+goods+",购买数量="+saleNum;}
}public interface GoodsSaleEbi {//保存销售信息,本来销售数据应该是多条,太麻烦了,为了演示,简单点 public boolean sale(String user,String customer,SaleModel saleModel);
}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;  //持有被装饰的组件对象 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);}
}

2. 总结
2.1 优点

  • 比继承更灵活
    .从为对象添加功能的角度来看,装饰模式比继承更灵活。继承是静态的,而且一旦继承所有子类都有一样的功能。而装饰模式采用把功能分离到每个装饰器当中,然后通过对象组合的方式,在运行时动态地组合功能,每个被装饰的对象最终有哪些功能,是由运行期动态组合的功能来决定的。
  • 更容易复用功能
    装饰模式把一系列复杂的功能分散到每个装饰器当中,一般一个装饰器只实现一个功能,使实现装饰器变得简单,更重要的是这样有利于装饰器功能的复用,可以给一个对象增加多个同样的装饰器,也可以把一个装饰器用来装饰不同的对象,从而实现复用装饰器的功能。
    简化高层定义

2.2 缺点

会产生很多细粒度对象。

2.3 装饰模式的本质:动态组合

《研磨设计模式》chap22 装饰模式Decorator(4)AOP+总结相关推荐

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

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

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

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

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

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

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

    //计算奖金的组件接口 public abstract class Component { public abstract double calcPrize(String user,Date begi ...

  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. 启动webpack-dev-server只能本机访问的解决办法
  2. 设计模式学习笔记十五——Command模式
  3. ThinkPHP“逻辑或”关系的多条件查询
  4. SPOJ4487(Splay树)
  5. 如何研究Maven build时发生了哪些事情
  6. 学习Raft算法的笔记
  7. python所有软件-这些Python开源软件解决了程序员几乎所有的问题
  8. 《JAVA并发编程实践》读书笔记(一)
  9. 佛山科学技术学院计算机科学与技术李欣华,第七届国务院学位委员会中文学科评议组2019年度 扩大会议在佛山科学技术学院召开...
  10. 最新版Activit7从原理到项目,工作流精讲上线
  11. Chrome浏览器断网时的小恐龙dino怎么一直玩?
  12. Apache Calcite论文概要
  13. 【数据结构和算法】赫夫曼树 | 实战演练(二)
  14. 服务器和交换机物理连接_服务器与交换机连接及校园网搭建方案
  15. 【FFmpeg编码】了解速率控制模式(x264、x265、vpx)
  16. 1833 雪糕的最大数量(排序)
  17. 元宇宙只是未来技术演化的外衣
  18. Android开发 拍照+读取相册+保存到本地
  19. 北斗三号卫星导航信号及接收策略
  20. read_exposure_data()

热门文章

  1. vue+springboot图片上传,addResourceHandlers调用无效
  2. Problems encountered while deleting resources. Could not delete 'E:\MyEclipse file\check\WebRoot\i
  3. wordpress怎么打开php网站,wordpress怎么做网站
  4. 数据中心夏季如何防雷
  5. 编程笔试(解析及代码实现):猴子吃桃。猴子第一天吃了若干个桃子,当即吃了一半,还不解馋,又多吃了一个…的C++、Java、Python、C#等语言代码实现
  6. Interview:算法岗位面试—上海某科技公司算法岗位(偏AI算法,国企)技术面试之BN层的认知、BP的推导、GD优化的几种改进等
  7. Paper:2017年的Google机器翻译团队《Transformer:Attention Is All You Need》翻译并解读
  8. 成功解决ERROR: Could not install packages due to an EnvironmentError: [Errno 28] No space left on device
  9. 成功解决AttributeError: module 'tensorflow.python.ops.nn' has no attribute '_seq2seq'
  10. 成功解决pandas\core\frame.py:2754: SettingWithCopyWarning: A value is trying to be set on a copy of a s