假设您有一个应用程序,由两个层组成:
A:数据层,存储从数据库或文件加载的所有数据
B:显示漂亮用户界面中的数据,例如图形报表的层
现在,在A层更改了数据。我们有两种方法来确保从B层生成的报告被正确更新。
第一种方法是PUSH方法。A层通过观察者通知B层,以便B层可以更新其报告。
PUSH方法存在几个缺点:
如果数据多次更改(例如在加载期间或更改大量数据的算法中),则观察者会执行多次。这可以通过引入某种缓冲区解决(在更改时防止调用观察者),但这可能非常棘手,并且经常忘记进行正确的缓冲调用。
如果更改了大量数据,则观察者调用可能会导致应用程序无法接受的开销。
另一种方法是PULL方法。A层只记住哪些数据已更改,并且不发送通知(标记A层为脏)。在用户执行操作之后(可以运行算法或加载文件或其他内容),我们检查所有用户界面组件,并要求它们更新自己。在这种情况下,将要求B层更新自己。首先,它将检查其底层层(A层)是否脏。如果是,它将获取更改并更新自己。如果A层不脏,则报告知道它没有任何事情要做。
最佳解决方案取决于具体情况。在我的情况下,PUSH方法似乎更好。
如果我们有超过2个层,则情况变得更加困难。假设我们有以下4个层:
A:数据层,存储从数据库或文件加载的所有数据
B:使用数据层(A层)的层,例如使用复杂的过滤功能过滤A中的数据
C:使用层B的层,例如将B层的数据聚合成较小的信息块
D:解释层C的结果,并以漂亮的图形方式呈现给用户的报告
在这种情况下,PUSH更改几乎肯定会引入更高的开销。
另一方面,PULL更改需要:
层D必须调用层C以询问其是否脏
层C必须调用层B以询问其是否脏
层B必须调用层A以询问其是否脏
如果没有任何改变,那么在您知道实际上没有任何改变且无需做任何事情之前,需要执行的调用次数相当多。似乎我们试图通过不使用PUSH来避免的性能开销,现在因为需要多次调用以询问是否存在更改而在PULL方法中回来了。
是否有解决这种问题的模式可以以一种漂亮和高性能(低开销)的方式进行?
A:数据层,存储从数据库或文件加载的所有数据
B:显示漂亮用户界面中的数据,例如图形报表的层
现在,在A层更改了数据。我们有两种方法来确保从B层生成的报告被正确更新。
第一种方法是PUSH方法。A层通过观察者通知B层,以便B层可以更新其报告。
PUSH方法存在几个缺点:
如果数据多次更改(例如在加载期间或更改大量数据的算法中),则观察者会执行多次。这可以通过引入某种缓冲区解决(在更改时防止调用观察者),但这可能非常棘手,并且经常忘记进行正确的缓冲调用。
如果更改了大量数据,则观察者调用可能会导致应用程序无法接受的开销。
另一种方法是PULL方法。A层只记住哪些数据已更改,并且不发送通知(标记A层为脏)。在用户执行操作之后(可以运行算法或加载文件或其他内容),我们检查所有用户界面组件,并要求它们更新自己。在这种情况下,将要求B层更新自己。首先,它将检查其底层层(A层)是否脏。如果是,它将获取更改并更新自己。如果A层不脏,则报告知道它没有任何事情要做。
最佳解决方案取决于具体情况。在我的情况下,PUSH方法似乎更好。
如果我们有超过2个层,则情况变得更加困难。假设我们有以下4个层:
A:数据层,存储从数据库或文件加载的所有数据
B:使用数据层(A层)的层,例如使用复杂的过滤功能过滤A中的数据
C:使用层B的层,例如将B层的数据聚合成较小的信息块
D:解释层C的结果,并以漂亮的图形方式呈现给用户的报告
在这种情况下,PUSH更改几乎肯定会引入更高的开销。
另一方面,PULL更改需要:
层D必须调用层C以询问其是否脏
层C必须调用层B以询问其是否脏
层B必须调用层A以询问其是否脏
如果没有任何改变,那么在您知道实际上没有任何改变且无需做任何事情之前,需要执行的调用次数相当多。似乎我们试图通过不使用PUSH来避免的性能开销,现在因为需要多次调用以询问是否存在更改而在PULL方法中回来了。
是否有解决这种问题的模式可以以一种漂亮和高性能(低开销)的方式进行?