本篇章粗略讲解一下切面模式和QT信号槽的概念,是系统中非常重要的信息传递途径。
面向切面编程更详细的介绍可以自行百度了解,这里只是说一下自己的理解,粗略涉及,也有可能不是完全正确。
面向切面是相对于面向过程、面向对象提出的一个概念。我自己的理解三种方式并不是并列关系,而是递进的关系。
面向过程与面向对象的区别个人理解就是整理代码。把功能进行切割,细分化,然后根据功能进行分类打包,实现代码复用率的提高 。
而面向切面与面向对象的区别个人理解就是编程方式上的一种总结沉淀。面向切面说的直白一些就是监控对象的创建、属性的变化的过程。例如实现属性的get, set方法,使得属性变化可以被截获,并且可以注册事件把这个变化传递出去。
我刚开始接触面向切面的时候觉得好像没什么太大的作用。直到接触了一些优秀的类库,比如Castle.Core,再加上开发有一些规模的项目的时候,特别是中后期的维护工作,那种难以言表的困苦感,才意识到面向切面真正的强大。
QT信号槽的概念网上有很多优秀的文章在解读,在这里只是粗略说一些自己的理解。QT的信号槽实质上就是C#等语言里面的事件。但是我之所以喜欢信号槽是因为他的使用感觉比事件简单明了很多,相对维护等成本也低。最重要的是这个概念可以实现解耦合。这就非常NICE了。
这两种方式结合到一些,就能够开发出说不出来的非常奇妙的东西出来,最开始我去实现这套框架的动力,也是来自于这一个难以言表的奇妙的感觉。总觉得值得去做一下。总结一句话就是结合这两个东西,实现了万物皆可接口化。哪怕是一个项目里面,也可以做到极致解耦,不需要相互引用,只需要调用接口就能够实现互联互通。
举个例子:
项目1中创建对象:
[SignalSolt("DataChangeEntity")]
public class DataChangeEntity : FEntity<DataChangeEntity>
{
[SignalSolt("DataChangeEntity_Type")]
public virtual int Type { get; set; } = 0;
/// <summary>
/// 新建.
/// 固定格式.
/// </summary>
/// <returns></returns>
public static DataChangeEntity New(string objectID = null)
{
return SignalSoltNewEntity.New<DataChangeEntity>(objectID);
}
}
毫不相干的项目2注册事件
SignalSoltRegister.AddSolt("Test1.DataChangeEntity", (key, item) =>
{
});
SignalSoltRegister.AddSolt("DataChangeEntity", (key, item) =>
{
this.Invoke(new Action(() =>
{
this.Text = "Form1 " + (++i1) + " " + i2;
}));
});
SignalSoltRegister.AddSolt("DataChangeEntity_Type", (key, item) =>
{
this.Invoke(new Action(() =>
{
this.Text = "Form1 " + i1 + " " + (++i2);
}));
});
当项目1创建DataChangeEntity对象,或者改变DataChangeEntity对象的属性Type的时候,在项目2中都会对应的触发。事件注册也变得不再是强引用了,而是通过项目1告诉项目2,你注册事件的时候,接口“DataChangeEntity”就能获取我创建对象的事件,接口“DataChangeEntity_Type”就能够获取我改变对象属性的事件。