1. 通过继承实现
public interface IA { void DoSth(); } public class A: IA { public virtual void DoSth() { } } public class B : A,IA { public override void DoSth() { before(); base.DoSth(); after(); } public void before() { } public void after() { } }
2. 装饰者/代理模式(由继承改作组合)
public interface IA { void DoSth(); } public class A2: IA { public void DoSth() { } } public class B2 : IA { private IA a; public B2(IA a) { this.a = a; } public void DoSth() { before(); this.a.DoSth(); after(); } public void before() { } public void after() { } }
3. 访问者模式
public interface IA { void DoSth(); } public class A3 : IA { public void DoSth() { } public void Proceed() { DoSth(); } } public class MyInterceptor { public void Intercept(IA invocation) { before(); if(invocation != null) invocation.DoSth(); after(); } public void before() { } public void after() { } }
4.ASP.NET MVC中的拦截器。
public interface IAdditionalOp { void before(); void after(); } public class AdditionalOp :Attribute, IAdditionalOp { public void before() { } public void after() { } } public class A4 { [AdditionalOp] public void DoSth() { } } public class B4 { public void Run() { var classUnder = typeof(A4); var allMethods = classUnder.GetMethods(); var methodUnder = allMethods.Where(m => m.Name == "DoSth"); foreach (MethodInfo methodInfo in methodUnder) { Attribute[] attributes = Attribute.GetCustomAttributes(methodInfo, typeof(AdditionalOp)); foreach (var item in attributes) { (item as AdditionalOp).before(); } A4 a4 = new A4(); a4.DoSth(); foreach (var item in attributes) { (item as AdditionalOp).after(); } } } }
5. 动态代理
时间: 2024-10-10 15:37:33