适用于现有应用程序的模式

时间:2012-01-15 18:53:44

标签: design-patterns adapter

我有一个很久以前写的应用程序。部分应用程序从DB获取字符串(这是一个日期)并将其显示在屏幕上。

由于DATE转换为字符串然后存储在DB中。在显示它时,字符串(DATE)从db重新获得并显示在Winform上。

现在,我们需要支持法国客户和法国遵循-DDMMYYYY格式的需求。我想过在DB层和UI层之间使用adpater模式。适配器根据区域设置转换DATE格式。

  1. 我的问题是,在这个场景中,我必须创建一个这个适配器的对象。因为我正在修改课程。不违反开放原则。

  2. 是使用适配器模式的正确方法。在使用客户端应用程序时使用适配器模式是否可以(在这种情况下,人们在过去5年中使用它)。

  3. 或任何其他方式来更改功能以支持客户的要求。

  4. 谢谢你, 戒日

2 个答案:

答案 0 :(得分:1)

适配器模式用于将现有接口转换为客户端需要/期望的接口。但听起来你需要的只是重新格式化的日期 - 它仍然是一个字符串。这听起来不像适配器本身的工作。

使用适配器模式,理论上您不必打开现有的类。适配器包装要调整的类并公开新接口。我想象的是痛苦的是,适配器类也必须通过所有未更改的公共内容,因为客户端理想地只与适配器“对话”,而不是原始类。

一般解决方案

一般的想法是在UI控件设置为值之前重新格式化日期。我希望您的UI控件类具有在实际OnChange事件之前触发的事件。

您的应用程序是否在C#中?它是否使用.NET Binding类?

.NET Binding类有2个非常非常方便的事件:ParseFormat。它们在生活中的目的是允许您更改格式,值,类型,以及值来回传递的任何您不需要修改任何现有接口或现有方法代码。添加事件处理程序以重新格式化日期字符串。

开放/封闭原则不是绝对的
如果您有充分的理由打开课程进行修改,那么确定。但请记住一些隐含的开放/封闭目标:

  • 请勿更改现有界面
  • 不要更改现有行为。我们正在添加新内容,我们不想意外更改现有内容。
  • 修改代码比编写新代码更容易出错。

打开/关闭不是借口:

  • 不重构糟糕的代码来实现理智的修复
  • 为了打开/关闭而做出错误的修复决定

答案 1 :(得分:0)

将域逻辑与表示逻辑和持久性分开是一种很好的做法。

您谈论的DB layerUI layer之间的适配器似乎是domain model