AOP实践 演讲人:陈思荣.

Slides:



Advertisements
Similar presentations
主要内容 Java 的常用包 Java 的常用包 “ == ” 和 “ equals ” 的用法 “ == ” 和 “ equals ” 的用法 基本数据类型与引用类型 基本数据类型与引用类型 String 和 StringBuffer String 和 StringBuffer 对象的克隆( clone.
Advertisements

单元二:面向对象程序设计 任务二:借书卡程序设计.
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
项目7 面向对象高级.
项目6 通用堆栈.
第16章 代理模式 Website:
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
四資二甲 第三週作業 物件導向程式設計.
面向对象的程序设计(一).
MVC Servlet与MVC设计模式.
项目:贪吃蛇游戏设计 工作任务一:系统设计(system design) 工作任务二:豆类(Bean)设计
國立高雄應用科技大學招生委員會 104 學年度碩士在職專班招生 在職服務證明書 表一 報考所 別 姓名 性別 生日 年月日 服務機 構
中国公务员制度 主讲:吴春华 教授 温志强 副教授.
设计模式可以帮助我们改善系统的设计,增强 系统的健壮性、可扩展性,为以后铺平道路。
项目:贪吃蛇游戏设计 工作任务三:块类(Block)设计 工作任务四:蛇类(Snake)设计
第二章 JAVA语言基础.
類別與物件 Class & Object.
第9章 单例模式 Website:
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
物件導向程式設計 (Object-Oriented rogramming)
第四章 在 C# 中实现 OOP 概念.
CHAPTER 9 建構方法 ROBERT.
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
第四次课后作业 1 问题描述: 将谜题定义为:包含一个初始位置,一个目标位置,以及用于判断是否是有效移动的规则集。
Ch13 集合與泛型 物件導向程式設計(2).
本單元介紹何謂變數,及說明變數的宣告方式。
西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.
程式設計實作.
CH09 套件 物件導向程式設計(II).
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
程序设计期末复习 黎金宁
2018/12/3 面向对象与多线程综合实验-网络编程 教师:段鹏飞.
第9章 多线程 王德俊 上海交通大学继续教育学院.
Java程序设计 第9章 继承和多态.
王豐緒 銘傳大學資訊工程學系 問題:JAVA 物件檔輸出入.
并发机制 结果应该为: 线程 1: 1 线程 1: 2 线程 1: 3 线程 1: 4 线程 1: 5 线程 2: 6 线程 2: 7
第一次课后作业 1. C/C++/Java 哪些值不是头等程序对象 2. C/C++/Java 哪些机制采用的是动态束定
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
2019/1/16 Java语言程序设计-类与对象 教师:段鹏飞.
2019/1/17 Java语言程序设计-程序流程 教师:段鹏飞.
Java程序设计 第2章 基本数据类型及操作.
C/C++/Java 哪些值不是头等程序对象
$10 可空类型.
C#程序设计基础 第二章 数据类型.
第六章 属性、索引器、委托和事件.
P2P聊天工具.
简单工厂模式.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
《JAVA程序设计》 语音答疑 辅导老师:高旻.
第二章 Java基本语法 讲师:复凡.
C#程序设计基础 $3 成员、变量和常量.
Aspect Oriented Programming
第二章 Java基本语法 讲师:复凡.
第五次课后作业 1 问题描述: 将谜题定义为:包含一个初始位置,一个目标位置,以及用于判断是否是有效移动的规则集。
第二章 Java语法基础.
第五次课后作业 1 问题描述: 将谜题定义为:包含一个初始位置,一个目标位置,以及用于判断是否是有效移动的规则集。
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
硬幣遊戲解題詳解 王豐緒 銘傳大學資訊工程學系.
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
Chapter 2 Entity-Relationship Model
判斷(選擇性敘述) if if else else if 條件運算子.
第二章 Java基础语法 北京传智播客教育
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第二章 Java基本语法 讲师:复凡.
第6章 继承和多态 伍孝金
Summary
Presentation transcript:

AOP实践 演讲人:陈思荣

起源 从OOP开始的故事 核心 两种横切技术 优势 对设计模式的超越 案例 致命的抽奖机

OOP的传奇 继承 封装 多态性 对象层次结构

万物皆对象

1个问题… 日志功能 安全性 异常处理

日志功能 安全性 异常处理

在AOP的世界 软件系统 核心关注点 横切关注点 业务处理的主要流程 与业务逻辑关系不大的部分

“横切”技术,能 剖解开封装的对象,深入内部并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为 “Aspect”, 即方面。 横切技术,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为; 那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手 将这些剖开的切面复原,不留痕迹。

“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。” 高级方案构架师Adam Magee 减少系统的 重复代码 降低模块间的 耦合度 可操作性和可维护性 有利于系统未来的 “将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。” 高级方案构架师Adam Magee

横切技术

觉得抽象? 来看个实例吧

m_Orders.Add(order); } } public class OrderManager {     private ArrayList m_Orders;     public OrderManager()     {        m_Orders = new ArrayList();     }     public void AddOrder(Order order)     {         if (permissions.Verify(Permission.ADMIN))         {             m_Orders.Add(order);         }     }     public void RemoveOrder(Order order)     {         if (permissions.Verify(Permission.ADMIN))         {             m_Orders.Remove(order);         }     } } 考虑一个电子商务系统,需要对订单进行添加、删除等管理操作。毫无疑问,在实际的应用场景中,这些行为应与权限管理结合,只有获得授权的用户方能够实施这些行为。

public class ProductManager {     private ArrayList m_Products;     public ProductManager()     {         m_Products = new ArrayList();     }     public void AddProduct(Product product)     {         if (permissions.Verify(Permission.ADMIN))         {              m_Products.Add(product);         }     }     public void RemoveProduct(Product product)     {         if (permissions.Verify(Permission.ADMIN))         {              m_Products.Remove(product);         }     } } 同样的,在该电子商务系统中,还需要对商品进行管理,它采用了同样的授权机制

由于aspect是一个封装的对象,我们可以定义这样一个aspect: private static aspect AuthorizationAspect{……}

我们需要关注什么? point cut 在哪执行? advice 执行什么?

在这个aspect中定义point cut,在point cut中,定义了需要截取上下文消息的方法 private pointcut authorizationExecution(): execution(public void OrderManager.AddOrder(Order)) || execution(public void OrderManager.DeleteOrder(Order)) || execution(public voidProductManager.AddProduct(Product)) || execution(public void ProductManager.DeleteProduct(Product));

由于权限验证是在订单管理方法执行之前完成,因此在before advice中定义权限检查 before(): authorizationExecution() {     if !(permissions.Verify(Permission.ADMIN))     {         throw new UnauthorizedException();     } } 利用AOP技术,我们可以分离出系统的核心关注点和横切关注点,从横向的角度,截取业务管理行为的内部消息,以达到织入权限管理逻辑的目的。当执行AddOrder()等方法时,系统将验证用户的权限,调用横切关注点逻辑,因此该方法即为AOP的join point。对于电子商务系统而言,每个需要权限验证的方法都是一个单独的join point。由于权限验证将在每个方法执行前执行,所以对于这一系列join point,只需要定义一个point cut。当系统执行到join point处时,将根据定义去查找对应的point cut,然后执行这个横切关注点需要实现的逻辑,即advice。而point cut和advice,就组合成了一个权限管理aspect。

point cut切入点 本质上是一个捕获连接点的结构。在AOP中,可以定义一个point cut,来捕获相关方法的调用。 通知 Advice point cut的执行代码,是执行“方面”的具体逻辑。 方面 Aspect point cut和advice结合起来就是aspect,它类似于OOP中定义的一个类,但它代表的更多是对象间横向的部分。

关注点识别:三棱镜法则 在分析系统需求之初,利用AOP的思想,分离出核心关注点和横切关注点。在实现了诸如日志、事务管理、权限控制等横切关注点的通用逻辑后,开发人员就可以专注于核心关注点,将精力投入到解决企业的商业逻辑上来。同时,这些封装好了的横切关注点提供的功 能,可以最大限度地复用于商业逻辑的各个部分,既不需要开发人员作特殊的编码,也不会因为修改横切关注点的功能而影响具体的业务功能。 Business Logic属于核心关注点,它会调用到Security,Logging,Persistence等横切关注点。

静态横切 Introduce

public interface IValidatable { bool ValidateAddress(); } 举例来说,当前已经实现了一个邮件收发系统,其中类Mail完成了收发邮件的功能。但在产品交付后,发现该系统存在缺陷,在收发邮件时,未曾实现邮件地址的验证功能。现在,第三方产品已经提供了验证功能的接口IValidatable

public class MailAdapter:Mail,IValidatable {      public bool ValidateAddress()      {          if(this.getToAddress() != null)          {              return true;          }          else          {              return false;          }      } }

但是… 通过引入MailAdapter类,原来Mail对象完成的操作,将全部被MailAdapter对象取代。 Mail mail = new Mail(); IValidatable validate = ((IValidatable)mail).ValidateAddress(); Mail mail = new MailAdapter();

public aspect MailValidateAspect { declare parents: Mail implements IValidatable; public boolean Mail.validateAddress() { if(this.getToAddress() != null) { return true; } else { return false; } } } 静态横切的方法,并没有引入类似MailAdapter的新类,而是通过定义的MailValidateAspect方面,利用横切技术为Mail类introduce了新的方法ValidateAddress(),从而实现了Mail的扩展。因此原来的代码完全可行。

AOP rocks!!! Mail mail = new Mail(); IValidatable validate = ((IValidatable)mail).ValidateAddress(); 静态横切允许您不用创建很深的层次结构,以一种本质上更优雅、更逼真于现实结构的方式,插入跨越整个系统的公共行为。尤其是当开发 应用系统时,如果需要在不修改原有代码的前提下,引入第三方产品和API库,则静态横切技术将发挥巨大的作用。

AOP技术的优势使得需要编写的代码量大大缩减,节省了时间,控制了开发成本。同时也使得开发人员可以集中关注于系统的核心商业逻辑。此外,它更利于创建松散耦合、可复用与可扩展的大型软件系统。

致命的抽奖机

完美的 促销方案

你们必须在律师找上门之前解决问题!!

public void actionPerformed(ActionEvent e) { double randNum = Math public void actionPerformed(ActionEvent e) { double randNum = Math.random(); if (randNum == 1.0d) dlgToShow.showMsg(); System.exit(0); }

public aspect Winning { pointcut makeWinnable(LuckyClick lc): set(LuckyClick.StatusDialog LuckyClick.dlgToShow) && withincode(public void actionPerformed(*)) ; after(LuckyClick lc) : makeWinnable(lc) { //if (Math.random() > 0.5d ) { dlgToShow.showMsg(); }

等着升职吧

AOP还是一个完美的补丁技术

谢谢大家! 最美好的品质是在厄运中显示的。 培根