《研磨设计模式》chap22 装饰模式Decorator(4)AOP+总结
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+总结相关推荐
- Java私塾:研磨设计模式 之 装饰模式(Decorator)3
22.3 模式讲解 22.3.1 认识装饰模式 (1)模式功能 装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象增加功能,相当于是改变了对象的外观.当装饰过后,从外部使用系统的角度看 ...
- 二十四种设计模式:装饰模式(Decorator Pattern)
装饰模式(Decorator Pattern) 介绍 动态地给一个对象添加一些额外的职责.就扩展功能而言,它比生成子类方式更为灵活. 示例 有一个Message实体类,某个对象对它的操作有Insert ...
- 《研磨设计模式》chap22 装饰模式Decorator(1)模式简介
场景:算员工奖金,各种奖金,有个人销售奖,团队奖,环比增加销售奖等等 1. 正常编码 public class Prize {//计算某人在某段时间内的奖金,有些参数在演示中并不会使用, public ...
- 《研磨设计模式》chap22 装饰模式Decorator(2)应用到场景
//计算奖金的组件接口 public abstract class Component { public abstract double calcPrize(String user,Date begi ...
- 《研磨设计模式》chap22 装饰模式Decorator(3)I/O流
1.1 public class IOTest {public static void main(String[] args)throws Exception {//流式读取文件DataInputSt ...
- 设计模式之装饰模式(Decorator)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 设计模式之装饰模式(Decorator)
目录 前言 Decorator设计模式 解决的问题 案例:流操作的扩展 模式定义 结构 要点总结 前言 在学习侯捷老师的有关设计模式的课程(李建忠老师主讲)中,老师对23种设计模式的有自己的划分,如下 ...
- c语言装饰,C++设计模式之装饰模式(Decorator)
装饰模式是一种经典的类功能扩展模式,其精髓在装饰类使用继承加聚合的方式获得接口和要实现对象,然后通过自己实现扩展接口 作用装饰模式通过装饰类动态地将责任附加到对象上,若要扩展功能,无需通过继承增加子类 ...
- 研磨设计模式之 装饰模式-3
3 模式讲解 3.1 认识装饰模式 (1)模式功能 装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象增加功能,相当于是改变了对象的外观.当装饰过后,从外部使用系统的角 ...
最新文章
- 启动webpack-dev-server只能本机访问的解决办法
- 设计模式学习笔记十五——Command模式
- ThinkPHP“逻辑或”关系的多条件查询
- SPOJ4487(Splay树)
- 如何研究Maven build时发生了哪些事情
- 学习Raft算法的笔记
- python所有软件-这些Python开源软件解决了程序员几乎所有的问题
- 《JAVA并发编程实践》读书笔记(一)
- 佛山科学技术学院计算机科学与技术李欣华,第七届国务院学位委员会中文学科评议组2019年度 扩大会议在佛山科学技术学院召开...
- 最新版Activit7从原理到项目,工作流精讲上线
- Chrome浏览器断网时的小恐龙dino怎么一直玩?
- Apache Calcite论文概要
- 【数据结构和算法】赫夫曼树 | 实战演练(二)
- 服务器和交换机物理连接_服务器与交换机连接及校园网搭建方案
- 【FFmpeg编码】了解速率控制模式(x264、x265、vpx)
- 1833 雪糕的最大数量(排序)
- 元宇宙只是未来技术演化的外衣
- Android开发 拍照+读取相册+保存到本地
- 北斗三号卫星导航信号及接收策略
- read_exposure_data()
热门文章
- vue+springboot图片上传,addResourceHandlers调用无效
- Problems encountered while deleting resources. Could not delete 'E:\MyEclipse file\check\WebRoot\i
- wordpress怎么打开php网站,wordpress怎么做网站
- 数据中心夏季如何防雷
- 编程笔试(解析及代码实现):猴子吃桃。猴子第一天吃了若干个桃子,当即吃了一半,还不解馋,又多吃了一个…的C++、Java、Python、C#等语言代码实现
- Interview:算法岗位面试—上海某科技公司算法岗位(偏AI算法,国企)技术面试之BN层的认知、BP的推导、GD优化的几种改进等
- Paper:2017年的Google机器翻译团队《Transformer:Attention Is All You Need》翻译并解读
- 成功解决ERROR: Could not install packages due to an EnvironmentError: [Errno 28] No space left on device
- 成功解决AttributeError: module 'tensorflow.python.ops.nn' has no attribute '_seq2seq'
- 成功解决pandas\core\frame.py:2754: SettingWithCopyWarning: A value is trying to be set on a copy of a s