AOP为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,AOP是OOP的延续,AOP是一种模式,Gregor Kiczales 在1997年领导一队研究人员首次介绍了AOP。当时他们关心的问题是如何在大型面向对象的代码库中重复使用那些必要且代价高的样板,那些样板的通用例子具有日志,缓存和事务功能。
概览
推动 AOP 模式的重要因素之一就是开发人员开始关注 OOP 模式中的切面关注点,关注点是一个系统中的功能片段,
优势
1.将通用功能从业务逻辑中抽离,避免重复性劳动,易维护。
2.模块化,降低架构耦合度,复杂度。
3.非侵入式代码,保持良好的代码健壮
1.静态拦截
已最简单的静态拦截为例,理解 AOP 的模式。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| public class User { public User() => this.PostTime = DateTime.Now; public string Name { get; set; } public string Password { get; set; } public DateTime PostTime { get; set; } }
public interface IMakeProcessor { void Output(User user); }
public class MakeProcessor : IMakeProcessor { public void Output(User user) => Console.WriteLine($"> 用户:{user.Name},请求时间:{user.PostTime.ToShortDateString()}"); }
public class MakeProcessorDecorator : IMakeProcessor { public IMakeProcessor makeProcessor { get; set; } public MakeProcessorDecorator(IMakeProcessor makeProcessor) => this.makeProcessor = makeProcessor; public void Output(User user) { Pre(user); makeProcessor.Output(user); Pred(user); }
public void Pre(User user) { Console.WriteLine("\n\n> 正在登陆,校验用户中. . . . . ."); if(!user.Password.Equals("123456")) { Console.WriteLine("> 密码错误 ! (401)"); } else { Console.WriteLine("> 登陆成功 ! (200)"); } }
public void Pred(User user) { Console.WriteLine("> 登陆请求结束,进行日志记录. . . . . ."); } }
class Program { static void Main(string[] args) { User user1 = new User() { Name = "user1", Password = "123" }; User user2 = new User() { Name = "user2", Password = "123456" };
IMakeProcessor makeProcessor = new MakeProcessorDecorator(new MakeProcessor()); makeProcessor.Output(user1); makeProcessor.Output(user2);
Console.ReadLine(); } }
|
我们通过一个 MakeProcessorDecorator 类,去代理 MakeProcessor 实现了静态的拦截。
上面代码看起来还不错,但是也仅限于这个Demo,真正的生产环境中,我们需要对数据进行校验,还要进行日志记录,还要考虑多种环境,如断线重连啊,请求失败啊。。。。。那有100个甚至1000个这种业务类,我们都要去构建一个代理类,那是不是想死的心都有了,所以这篇文章只是让大家理解 AOP 的模式,这样的写法很愚蠢,并不会应用到实际开发中。