对象装饰 – 编译语言运行时行为的解决方案





0/5 (0投票)
讨论为编译语言添加运行时行为
编译语言一直被批评为无法像其对应物——解释型语言那样在运行时添加行为。但这不应该如此。通过对象装饰,可以在编译语言中向对象添加运行时行为。这是一种简单但强大的软件可扩展性方法。它补充了编译语言的基于类的编程,并且优于解释型语言的动态类型。
对象装饰的思考方式
对象装饰意味着将额外的行为附加到对象上。其思想是:你有一个对象,其方法执行定义的行为。现在,你希望在方法执行之前或之后添加一些额外的行为。因此,你通过装饰将额外的行为附加到方法上,以便在运行时调用方法时,附加的行为在之前或之后执行。
一旦你理解了这个概念,装饰本身就非常简单。最基本的是,你需要指定一个对象、对象的方法(们)、额外的行为(们)以及额外行为的位置(之前或之后)。所有这些都通过一个调用完成,如下所示
doAThing = ObjectProxyFactory.CreateProxy2<IDoAnything>(
doAThing,
new string[] { "DoThing" },
new Decoration2(SayHello, null),
new Decoration2(SayBye, null)
);
在这里,你将对象 doAThing
作为第一个参数指定,然后是其方法 DoThing
,预处理(之前)行为 SayHello
和后处理(之后)行为 SayBye
。所有这些都表示我想在方法 DoThing
的对象 doAThing
之前添加行为 SayHello
,之后添加行为 SayBye
。该调用返回原始对象的代理。然后,你可以像使用原始对象一样使用该代理。现在,代码
doAThing.DoThing();
首先执行 SayHello
,然后执行实际方法 DoThing
,最后执行 SayBye
。
完整的代码如下所示
using CBOExtender;
namespace HelloWorld
{
public interface IDoAnything {
void DoThing();
}
public class DoAnything : IDoAnything {
public void DoThing() { }
}
class Program
{
static void Main(string[] args)
{
IDoAnything doAThing = new DoAnything();
doAThing = ObjectProxyFactory.CreateProxy2<IDoAnything>(
doAThing,
new string[] { "DoThing" },
new Decoration2(SayHello, null),
new Decoration2(SayBye, null)
);
doAThing.DoThing();
}
public static void SayHello(AspectContext2 ctx, dynamic parameters)
{
System.Console.WriteLine("Hello!");
}
public static void SayBye(AspectContext2 ctx, dynamic parameters)
{
System.Console.WriteLine("Bye!");
}
}
}
更多信息
要下载 CBOExtender
,请在 Visual Studio 10 内部使用 NuGet 搜索 CBOExtender
,或点击 这里。
要了解如何通过装饰将日志记录、安全检查和排序作为额外的运行时行为添加到对象中,请点击 这里。
要了解如何通过装饰将事务作为额外的运行时行为添加到对象中,请点击 这里。
要了解对象装饰与动态类型之间的区别,请点击 这里。
要查看我所有的文章和博客,请点击 这里。
