所以我的問題是:我應該把這個邏輯放在同一個主持人?
在我看來,沒有。演講者有不同的責任,所以邏輯應該分成專門的演講者類。
我是否應該通過繼承它來改變此演示者?
在我看來,繼承是這個問題的錯誤解決方案。主持人唯一的共同點就是他們碰巧在相同的視圖和模型對上行事。
因此,您需要將演示者功能移到單獨的類中,但不使用繼承。之前我說過,主持人之間唯一的共同點是他們採取相同的觀點和模式對。考慮到這一點,我們可以爲演示創建以下抽象:
public interface Presenter<M, V>
{
M Model { get; }
V View { get; }
}
您可以實現此接口來創建一個具體的演示提供了主持人子類行爲時所需的視圖和模型對。接下來,爲您的PC和掃描儀演示者創建單獨的演示者類,它們提供每個視圖所必需的功能。
這個想法是,你現在可以使用decorator pattern建立所需的演示功能,具體取決於當前視圖。爲了方便這一點,你可以創建下面的類:
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; }
}
}
這允許您將現有的主持人以及具有附加功能,提供他們的行爲在同一個視圖和模型對增強他們。
要完成這一切,您首先需要一個提供相關視圖和模型類型的具體演示者。理想情況下,視圖和模型將被注入到構造函數中,這意味着該演示者不應該做任何事情,而是從實現接口提供的屬性中返回視圖和模型。理想情況下,模型應該注入已設置的默認值。請注意,此功能可以移入一個通用的基類,它允許您初始化任何視圖/模型對。
接下來,對於視圖/模型對的每項離散功能,您必須創建一個來自PresenterDecorator
類的演示者。在你的情況下,你會有DefaultPresenter
和ScannerPresenter
。這些演示者類別中的每一個還可以提供定製構造函數,除了要進行裝飾的演示者之外,其還提供任何所需的服務。
在應用程序的一部分,負責打開電腦屏幕和配置您的主持人,你會做這樣的事情:
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
類,它提供了additi你需要的功能(爲了最大的靈活性,每個主持人裝飾者都應該寫出來,以便施工順序無關緊要)。
可以使用依賴注入框架來簡化應用程序的接線和配置,以便在需求改變時不需要手動重寫上述代碼。
現在這看起來像很多工作來啓動和運行,但一旦核心抽象到位,它真的可以很容易地添加到您的應用程序的新功能。
如果給出了一個新的要求,您只需創建一個新的演示者類,該類從PresenterDecorator
類派生並更改您的配置代碼以適應(提示:使用依賴注入框架使其更容易)。請注意,您不必觸摸任何現有的演示者類。每個演示者類別也可以完全隔離地進行測試。
您還可以創建通用展示器裝飾器,它可以應用於任何視圖和模型對,這使得數據驗證非常簡單。
我知道這是一個很長的答案,並且有很多事情要做,所以如果您需要進一步澄清或對此方法有任何想法,請留下評論。
如果這是WPF,我強烈建議MVVM而不是MVP。 ViewModel實際上與技術無關,並且完全與UI分離以實現最大的可重用性。 –
MVP模式中的演示者也是技術不可知的,並且從UI完全分離以實現最大的可重用性。 –