设计问题:不同背景下的行为

时间:2011-07-05 15:56:42

标签: c# sql design-patterns

我有一个普遍的问题:当对象的行为应该根据上下文改变时应该怎么做? (请注意,这是关于SQL而不是C#,但我真的可以在这里使用想法)

例如,Search类,我们称之为“SearchObject”。此SearchObject获取搜索字词并从Google返回5个结果。它只是做到了这一点 现在我有了一个新的要求:如果从某个上下文调用该对象,它会附加另一个搜索引擎的结果。例如,如果我从网页调用搜索,则此对象应该带来10个结果:前5个来自Google,最后5个来自Bing。如果从控制台应用程序调用它,它应该带来AltaVista的最后5个结果。

如何根据OOP原则保持此对象的行为并获得所需的结果? (实现将在SQL中,因此我不能使用我在C#中知道的设计模式...)

谢谢!

3 个答案:

答案 0 :(得分:1)

显然,在其他地方这样做会更常见,但如果你在SQL中保留行为逻辑,你可以做以下其中一种

使用参数

只是将一些东西传递给程序。例如

Create Proc sp_Search (@Search varchar(500), @behavior int)
AS

if @behavior = 1
 ...
if @behavior = 2
...

但是,这需要您的应用程序了解此参数,这可能不是您想要做的。

使用有关会话的内容

您还可以使用有关会话的信息。例如APP_NAME()

Create Proc sp_Search (@Search varchar(500))
AS

if APP_NAME()=  'Application A'
 ...
if APP_NAME()= 'Application B'
...

使用特定用户

另一个选择是将用户名发送到他们将要使用的上下文,然后使用CURRENT_USER

创建Proc sp_Search(@Search varchar(500))     AS

if CURRENT_USER()=  'ConsoleCreds'
 ...
if  CURRENT_USER()= 'WebCreds'
...

老实说,我宁愿允许任何应用程序(机制)的任何行为,然后为每个应用程序配置策略,而不是将机制和策略捆绑在一起(如上所述)

答案 1 :(得分:0)

如果我是用C#编写的,我会做一些事情,就像拥有一个提供给SearchObject的上下文对象并生成必要的参数。

要在SQL中实现类似的想法,您将拥有一个带有ContextName,SearchEngine,TopX等的Context表,并将其连接到Searches表(假设您在此处进行某种缓存)以获得结果。

像...这样的东西。

SELECT * FROM Searches s  
  INNER JOIN Context ct ON sr.search = ct.search
  WHERE sr.rank <= ct.TopX
  AND   (searchterm = ... etc )
UNION
SELECT * FROM (SELECT s.*, rank() OVER (partition by search_term,search order by rank asc), FROM Searches s ORDER BY rank ASC)
  INNER JOIN Context ct ON sr.search = ct.search
  WHERE sr.rank <= ct.BottomX
  AND   (searchterm = ... etc )

答案 2 :(得分:0)

每当您有多种算法/技术/方法来实现目标,并且想要决定使用哪种技术时,您应该考虑使用Strategy模式。

策略经常与FactoryMethod模式配对。基本上,调用FactoryMethod,传递它所需的任何数据来做出决定。它封装了实际的决策逻辑,并返回适当策略对象的实例。