首页 > 代码库 > AOP编程浅析

AOP编程浅析

  AOP,也就是面向切面编程,它是对OOP的一种补充。什么是面向切面编程?切面是指在多个程序模块之间可能存在共同的点需要进行特殊的处理。这些处理跟通用业务逻辑无关,而且对不同的类可能出现不同的特殊处理逻辑。假如使用OOP的编程方法,可能是在每个相关的类里面加入相关的处理逻辑。这样代码有点混乱,不够清晰,而且耦合性较高。AOP就是专门为了解决这一类问题,降低这些特殊处理逻辑与通用业务逻辑的耦合性,使代码更清晰,更易于管理。

  比如说我们现在有一个抽象业务逻辑基类A,它有一个业务逻辑方法需要子类去重写。对于子类而言,十个子类可能都需要实现一个下载的业务。但是对下载的数据怎么处理肯定不尽相同。在下载业务执行之前也难免要进行某些验证之类的特殊操作。这些业务子类处于不同的页面,有着自己的个性逻辑和通用业务,假如每个子类都维护自己的特殊逻辑,显得混乱不堪,毫无条理,也不易于维护。实际上,这几个子类应该只关心通用业务。我们可以在通用业务方法执行前后设置拦截器,在拦截方法里处理特殊逻辑,并从外部调用这些方法,动态的判断是否需要拦截。这样既符合MVC的设计模式,也使得大家各司其职,通力协作。

  简单的说了一小段,其实我对AOP模式理解也很初级。关乎设计的东西算比较高深的内容了,只需要知道他们确实为了解决某些问题而出现就行了。等真要自己处理类似问题时可以回想一下,AOP适用的范围,是方法层面的,而不是类层面的。它是为了解决跨越多个类、多个模块之间的方法编程而出现的。现在先上一段代码,实现一个简单的拦截器。实际上就是给类加一层“壳”,不直接通过该类的对象调用,而是使用类似代理的模式,由代理人代为执行。

  下面这个测试类是简单的示范。实际上应该通过一个管理类统一管理归属该类节制的子类的方法调用。总体来说,这篇代码我不太满意。因为我自己也不太理解。不过今天这篇文章只是设计模式和编程范型初探,接下来随着学习的深入相信会对设计模式和范型有更好的理解。

using UnityEngine;using System.Collections;using System.Reflection;using System;using System.Collections.Generic;public class TestAOP : MonoBehaviour {    public string _interaptor = "_interceptor ";    public string _prefix = "_before_";    public string _postfix = "_after_";    public Dictionary<string,int> context = new Dictionary<string,int>();    public void invoke(Calculator cal,string method,IDictionary context){        Type t = cal.GetType();        MethodInfo _method = t.GetMethod(method);        if(!context.Contains("x")||!context.Contains("y"))            return;        int x =(int)context["x"];        int y = (int)context["y"];        object[] objs = new object[]{x,y};        if(null!=_method){            MethodInfo _interceptor = t.GetMethod("_interceptor");            if(null!=_interceptor){                _interceptor.Invoke(cal,objs);            }            MethodInfo prefix = t.GetMethod(_prefix+method);            if(null!=prefix){                prefix.Invoke(cal,objs);            }            _method.Invoke(cal,objs);            MethodInfo postfix = t.GetMethod(_postfix+method);            if(null!=postfix){                postfix.Invoke(cal,objs);            }        }    }    void Start(){        Calculator cal = new Calculator();        context.Add("x",4);        context.Add("y",6);        invoke (cal,"mul",context);    }}public class Calculator{//    public string x = "x";//    public string y = "y";    public int add(int x,int y){                 Debug.Log(x+y);        return x+y;    }    public int mul(int x,int y){        Debug.Log(x*y);        return x*y;    }    public void _interceptor(int x,int y){        if(x<0||y<0){            throw new Exception("parameter cannot be smaller than 0!");        }    }    public void _before_mul(int x,int y){        if(x+y==10){            throw new Exception("你为什么是10??");        }    }}

 

AOP编程浅析