gpt4 book ai didi

wpf - 通过 MVP 中的继承来改变 Presenter

转载 作者:行者123 更新时间:2023-12-04 02:31:51 25 4
gpt4 key购买 nike

我目前正在开发两种功能非常相似的表格,尽管一种表格用于 PC 上,而另一种表格专门用于低分辨率扫描仪设备。

我想尽可能多地分享逻辑,这就是我为此使用 MVP(被动 View )的原因。

但扫描仪版本与它有一些细微差别,例如动态显示和隐藏一些控件。这当然也是我想放入我的 Presenter 的东西,以便我可以对其进行单元测试。

所以我的问题是:我应该把这个逻辑放在同一个演示者身上吗?或者我应该通过继承它来改变这个演示者?还是我应该简单地将所有内容分开,专门用于特定的表单,尽管我的 View 和模型对于两种表单都是完全相同的?

最佳答案

So my question is: should I put this logic in the same presenter?



在我看来,没有。演示者有不同的职责,因此应将逻辑分成专用的演示者类。

should I make a variation of this presenter by inheriting from it?



在我看来,继承是这个问题的错误解决方案。演示者的唯一共同点是他们碰巧作用于相同的 View 和模型对。

因此,您需要将演示者功能移动到单独的类中,但不使用继承。之前我说过,演示者之间的唯一共同点是他们对相同的 View 和模型对采取行动。考虑到这一点,我们可以为演示者创建以下抽象:
public interface Presenter<M, V>
{
M Model { get; }
V View { get; }
}

你可以实现这个接口(interface)来创建一个具体的演示者,它为演示者子类提供所需的 View 和模型对来进行操作。接下来,您为 PC 和扫描仪演示者创建单独的演示者类,它们提供每个 View 所需的功能。

这个想法是您现在可以使用 decorator pattern根据当前 View 构建所需的演示者功能。为方便起见,您可以创建以下类:
public abstract class PresenterDecorator<M, V> : Presenter<M, V>
{
private readonly Presenter<M, V> decoratedPresenter;

public PresenterDecorator(Presenter<M, V> decoratee)
{
this.decoratedPresenter = decoratee;
}

public M Model
{
get { return this.decoratedPresenter.Model; }
}


public V View
{
get { return this.decoratedPresenter.View; }
}

}

这允许您包装现有的演示者,并为它们增加额外的功能,前提是它们作用于相同的 View 和模型对。

要使用所有这些,您首先需要一个提供相关 View 和模型类型的具体演示者。理想情况下, View 和模型将被注入(inject)到构造函数中,这意味着这个演示者除了从 Presenter 的实现提供的属性中返回 View 和模型之外什么都不做。界面。理想情况下,模型应该注入(inject)已经设置的默认值。请注意,此功能可以移动到允许您初始化任何 View /模型对的通用基类中。

接下来,对于 View /模型对的每个离散功能,您必须创建一个从 PresenterDecorator 派生的演示器。类(class)。在您的情况下,您将拥有 DefaultPresenterScannerPresenter .这些演示者类中的每一个还可以提供自定义构造函数,这些构造函数除了要装饰的演示者之外还提供任何所需的服务。

在负责打开 PC 屏幕和配置演示者的应用程序部分中,您可以执行以下操作:
var model = ... 
var view = ...

var presenter = new DefaultPresenter(new PresenterInitializer(view, model));

在您的应用程序中负责打开扫描仪屏幕和配置演示者的部分中,您可以执行以下操作:
var model = ... 
var view = ...

var presenter =
new ScannerPresenter(new DefaultPresenter(PresenterInitializer(view, model)));

请注意,当您配置扫描仪屏幕时,默认演示者使用 ScannerPresenter 修饰。提供您需要的附加功能的类(为了获得最大的灵 active ,应该编写每个演示者装饰器,以便构造顺序无关紧要)。

可以使用依赖注入(inject)框架来简化应用程序的布线和配置,这样如果需求发生变化,上述代码就不需要手动重写。

现在这看起来需要做很多工作才能启动和运行,但是一旦核心抽象到位,就可以很容易地向应用程序添加新功能。

如果给出了新要求,您只需创建一个新的演示者类,该类派生自 PresenterDecorator类并更改您的配置代码以适应(提示:使用依赖注入(inject)框架使这更容易)。请注意,您不必触及任何现有的演示者类。每个演示者类也可以完全隔离地进行测试。

您还可以创建通用的演示者装饰器,它可以应用于任何 View 和模型对,这使得数据验证之类的事情变得非常简单。

我知道这是一个很长的答案,并且有很多内容需要考虑,因此如果您需要任何进一步的说明或对使用此方法有任何想法,请发表评论。

关于wpf - 通过 MVP 中的继承来改变 Presenter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21431737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com