Presentation is loading. Please wait.

Presentation is loading. Please wait.

AOP实践 演讲人:陈思荣.

Similar presentations


Presentation on theme: "AOP实践 演讲人:陈思荣."— Presentation transcript:

1 AOP实践 演讲人:陈思荣

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

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

4 万物皆对象

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

6 日志功能 安全性 异常处理

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

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

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

10 横切技术

11 觉得抽象? 来看个实例吧

12 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);         }     } } 考虑一个电子商务系统,需要对订单进行添加、删除等管理操作。毫无疑问,在实际的应用场景中,这些行为应与权限管理结合,只有获得授权的用户方能够实施这些行为。

13 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);         }     } } 同样的,在该电子商务系统中,还需要对商品进行管理,它采用了同样的授权机制

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

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

16 在这个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));

17 由于权限验证是在订单管理方法执行之前完成,因此在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。

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

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

20 静态横切 Introduce

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

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

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

24 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的扩展。因此原来的代码完全可行。

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

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

27 致命的抽奖机

28 完美的 促销方案

29

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

31 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); }

32 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(); }

33 等着升职吧

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

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


Download ppt "AOP实践 演讲人:陈思荣."

Similar presentations


Ads by Google