我有一個控件,我們可以根據一些業務規則顯示一些指向不同網站的鏈接。目前,所有構建鏈接列表的業務邏輯都處於控制之中。 我打算從控件中移出總線邏輯。設計問題
這將是一個很好的設計? 我可以使用任何設計模式嗎?
我有一個控件,我們可以根據一些業務規則顯示一些指向不同網站的鏈接。目前,所有構建鏈接列表的業務邏輯都處於控制之中。 我打算從控件中移出總線邏輯。設計問題
這將是一個很好的設計? 我可以使用任何設計模式嗎?
你不應該太思考模式。大多數情況下,它們都是過度殺傷性的,並且增加了太多的複雜性。特別是像這樣一個微不足道的場景。
只是利用良好的面向對象的做法,你會沒事的。將業務邏輯封裝在另一個類中,併爲您的控件提供公共屬性以訪問它。把事情簡單化!
Model-View-Presenter模式怎麼樣?
另一個不錯的選擇可能是Mediator pattern。
我不知道你是如何實現你的業務規則,但這裏是一個想法...
我將你的數據綁定Web表單列表控件。
public class YourLinks
{
// You could do it by overloading the constructor...
// Again not sure how you determine what links should be displayed...
// If you had consistent types you could make your constructor internal
// and then create a YourLinkBuilder see below...
public YourLinks(User user, Region region)
{
}
public YourLinks(City city)
{
}
// Databind to this method...
public IEnumerable<string> GetLinks()
{
// return your links...
}
}
public class YourLinkBuilder
{
public static YourLinks BuildPowerUserLinks()
{
return new YourLinks(new PowerUser(), new Region("Washington"));
}
public static YourLinks BuildVisitorLinks()
{
return new YourLinks(new VisitorUser(), new Region("Empty"));
}
}
鑑於所提供的信息很少,我建議您創建一個僅包含鏈接(及其相關數據)的模型。以便您可以將LinksModel傳遞給您的視圖進行渲染。或者將您的LinksModel傳遞給您的現有模型(作爲子模型)。
無論哪種方式,所有這些數據都被封裝。因此,如果您想稍後向其添加數據,它不會更改您的方法簽名(或一般合同)。如果你想從中刪除數據,相同的優勢。如果你想完全刪除它,它只有一個對象,並簡化了刪除。
您也可以構建鏈接視圖渲染器,以便它只知道如何直觀地顯示LinksModel。因此,在您的視圖中,您可以將鏈接信息的視覺方面委派給此類呈現器,而不是在現有視圖中具有邏輯。如果您想要更改鏈接視圖的外觀,或希望賦予用戶選擇不同渲染的力量,則可以簡單地使用不同的渲染器,而不是用'if'塊阻塞整個代碼。
Jeach!
當然,您應該使用Model-View-Presenter。在看來,你應該有你的控制權。
控件的責任應該僅僅是從用戶那裏接受輸入,驗證它並將該信息傳遞給演示者。然後,演示者應該與存儲業務規則的模型進行交互。
從模型中,您可能希望返回隨後傳遞給控件進行顯示的鏈接,或者您可能希望返回一些傳遞給另一個系統以檢索鏈接的元數據。
我會做的是在模型中使用策略模式,以便您可以輕鬆地調換和調出不同版本的業務規則。
要抽象與後端數據源的交互(如果有的話),請查看Martin Fowler的網關模式。
你真的需要一個自定義控件嗎?
Model-View-Controller建議您在控件中只顯示邏輯。
找到一個解決方案,允許您對內置控件(ListView)進行微小更改並在其他地方創建自定義數據集以傳遞給它。
我相信在這種情況下思考模式可能實際上會導致更簡單的解決方案。 – 2009-04-15 22:14:13