我有一个普遍的问题:当对象的行为应该根据上下文改变时应该怎么做? (请注意,这是关于SQL而不是C#,但我真的可以在这里使用想法)
例如,Search类,我们称之为“SearchObject”。此SearchObject获取搜索字词并从Google返回5个结果。它只是做到了这一点 现在我有了一个新的要求:如果从某个上下文调用该对象,它会附加另一个搜索引擎的结果。例如,如果我从网页调用搜索,则此对象应该带来10个结果:前5个来自Google,最后5个来自Bing。如果从控制台应用程序调用它,它应该带来AltaVista的最后5个结果。
如何根据OOP原则保持此对象的行为并获得所需的结果? (实现将在SQL中,因此我不能使用我在C#中知道的设计模式...)
谢谢!
答案 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,传递它所需的任何数据来做出决定。它封装了实际的决策逻辑,并返回适当策略对象的实例。