我想在亚当的答案中再加上一个例子。
使用方面是改善软件和OOP模块化的一种方法,只是OOP是“垂直”应用而AOP是“水平”应用。
因此,尽管可以使用建议来“水平”修改所有方法的行为以响应某些条件,但是建议中的代码还需要一些数据,ITD可以“水平”添加字段,同时包含在单个编译单元(方面)中相关的数据和代码。
由于您是通过ITD字段添加数据的,因此您可能还希望提供一些 *** 作这些字段的方法,例如setter / getter。
我几次尝试改写它,希望它易于理解。
举个例子,假设您有一个图形编辑程序,用户可以在其中创建,删除和显示许多Shape(相当经典的eh?:D)。
形状具有大量数据,例如,它们具有颜色,坐标等。它们正确地属于类本身。但是,由于这是一个Web
3.0应用程序,因此您希望用户能够在单个图形上进行协作,这意味着每种形状都必须知道何时更改了它,如果已与其他用户交流过该形状已更改,是否需要更改被实际拖动它的某个用户锁定等。
您可以在简单的OOP中执行此 *** 作,在Shape或任何根类中实现相关的部分,但是您将使用“
this.setDirty(true)”之类的调用污染所有的setter。
相反,您决定进行AOP并在一个方面实施它。在这种情况下,您可以轻松地在所有设置器之后添加建议,但是如果您要优化只发送变化增量的网络协议,则还需要存储“脏”布尔值,甚至是更改的属性列表。
你可以像这样实现
public aspect ShapesAreDirtyThings { private boolean Shape.dirty; after(Shape s) : execution(* Shape+.set*(..)) { s.dirty = true; // Set some other global field, start a thread to communicate // to other users about the change, whatever .. } public boolean Shape.isDirty() { return s.dirty; } public boolean Shape.findDirtyChildren() { // whatever}
对于普通的AOP,这是您无法做的,仅是将一个建议,该建议所需的数据以及最终将对该数据进行 *** 作的方法封装在一个编译单元中。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)