`
chillwarmoon
  • 浏览: 155065 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

策略模式在项目中的具体应用

阅读更多
往往大师级别的设计是简单的,易懂的,可扩展的,从不做作,整齐的代码让阅读的人感到很舒服。最近在看一个开源项目的源码,其中有好多的设计思想可以借鉴,相信这些优雅的代码也是在大量实践基础上,通过不断的重构而形成的。有一小段代码自认为写的不错,以下是源码:
EPAdministratorImpl类中:
java 代码
 
  1. private static ParseRuleSelector patternParseRule;  
  2. private static ParseRuleSelector eqlParseRule;  
  3.   static  
  4.   {  
  5.       patternParseRule = new ParseRuleSelector()  
  6.       {  
  7.           public void invokeParseRule(EQLStatementParser parser) throws TokenStreamException, RecognitionException  
  8.           {  
  9.               parser.startPatternExpressionRule();  
  10.           }  
  11.       };  
  12.   
  13.       eqlParseRule = new ParseRuleSelector()  
  14.       {  
  15.           public void invokeParseRule(EQLStatementParser parser) throws TokenStreamException, RecognitionException  
  16.           {  
  17.               parser.startEQLExpressionRule();  
  18.           }  
  19.       };  
  20.   
  21.   }  


这里用匿名内部类对接口ParseRuleSelector进行实现,并加到static块中,在LoadClass的时候,初始化成员变量patternParseRule和eqlParseRule,是策略模式的实现方,而对于这两个成员变量的使用仅仅在该类里的一个方法中:
java 代码
  1. AST ast = ParseHelper.parse(expression, patternParseRule);  

在其他地方这两个实现是不可用的,达到了很好的封装,因为ParseRuleSelector的目的就是选择EQLStatementParser的执行策略,不带有具体的业务数据,因此做成静态变量,使得对于一个Class仅有一个实例,节省内存。

在ParseHelper中的方法
java 代码
 
  1. public static AST parse(String expression, ParseRuleSelector parseRuleSelector) throws EPException {  
  2.         EQLStatementLexer lexer = new EQLStatementLexer(new StringReader(expression));  
  3.         EQLStatementParser parser = new EQLStatementParser(lexer);  
  4.         parseRuleSelector.invokeParseRule(parser);  
  5.         }  

调用接口,是面向接口编程,是策略模式的执行方,让具体的实现在EPAdministratorImpl中的匿名内部类完成。这样对于加入EQLStatementParser中的新方法,都可以在EPAdministratorImpl中对接口进行匿名实现,从而达到扩展的目的,并不需要改动ParseHelper。
分享到:
评论
5 楼 chillwarmoon 2007-11-06  
yongyuan.jiang 写道
不知楼主 创建 EQLStatementParser是否也使用策略模式 
 EQLStatementLexer lexer = new EQLStatementLexer(new StringReader(expression));    EQLStatementParser parser = new EQLStatementParser(lexer);  
  这段代码如果想告诉我们ParseRuleSelector使用了策略模式,写这段代码我认为清晰点: 
 ParseRuleSelector rule = getParseRuleSelector();   //获得EQL或Partten 策略 ASL asl = ParseHelper.parse(expression,rule); 
<br/>
<br/>
EQLStatementParser没有用策略模式,其实java中的策略模式可以等同为C或者C++中的函数指针,传递给函数<span><span class='keyword'>public</span><span> </span><span class='keyword'>static</span><span> AST parse(String expression, ParseRuleSelector parseRuleSelector) </span><span class='keyword'>throws</span><span> EPException的策略</span></span><span><span>ParseRuleSelector,其实是用的该类里边的</span></span><span><span>invokeParseRule(EQLStatementParser parser)方法;<br/>
</span></span>具体的策略类通常是用匿名类来实现的,在本例中,<span>静态成员变量patternParseRule和</span><span>eqlParseRule的初始化都是用匿名内部类,来选择是调用策略</span><span>startPatternExpressionRule,还是调用策略</span><span>startEQLExpressionRule。<br/>
<br/>
</span> 
 ParseRuleSelector rule = getParseRuleSelector();   //获得EQL或Partten 策略 
<br/>
你所说的这段代码也是获得的ParseRuleSelector,我感觉调用方是具体策略的选择者,而不是利用执行方获得默认的策略ParseRuleSelector。
4 楼 yongyuan.jiang 2007-11-06  
不知楼主 创建 EQLStatementParser是否也使用策略模式

EQLStatementLexer lexer = new EQLStatementLexer(new StringReader(expression));   
EQLStatementParser parser = new EQLStatementParser(lexer); 


这段代码如果想告诉我们ParseRuleSelector使用了策略模式,写这段代码我认为清晰点:

ParseRuleSelector rule = getParseRuleSelector();   //获得EQL或Partten 策略
ASL asl = ParseHelper.parse(expression,rule);
3 楼 cljspn 2007-11-06  
策略模式就是这么个缺点,如果分支多了,子类也就多了,对于客户端也要了解所有的策略。
2 楼 chillwarmoon 2007-08-05  
david_mou 写道
弱弱的问下,实例中就两个策略类,如果策略较多咋办


这里的代码只是一部分,原来的代码多于2个策略,如果你说的这里的策略过于复杂,可以单独的对策略部分进行OO分析和设计。
1 楼 david_mou 2007-08-05  
弱弱的问下,实例中就两个策略类,如果策略较多咋办

相关推荐

    策略模式在实际项目中的应用二

    例如,"策略模式在实际项目中的应用二"可能涉及到一个系统中对不同数据处理策略的灵活切换。在这个测试Demo中,我们可能有一个核心业务逻辑,它需要根据不同的条件或请求,采用不同的策略进行处理。这些策略可以是...

    策略模式在实际项目中的应用一

    在这个名为"策略模式在实际项目中的应用一"的项目中,我们可能可以看到以下的结构: 1. `Context`角色:这个角色通常被称为上下文,它维持了一个对策略对象的引用,使用这个策略对象来执行特定的算法。在Java中,这...

    spring事件驱动 + 策略模式应用

    技术: 1. spring事件驱动(ApplicationEventPublisher) 2. 策略模式处理事件 目的: 1. 通过event,代码逻辑异步处理 2. 通过策略模式,构建具体监听实现 3. 解耦 4. 容错(降低代码块错误风险)

    设计模式在android中的应用之2,策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Android开发中,策略模式的应用可以帮助我们更好地实现灵活性和可扩展性,...在实际项目中,结合MVC、MVVM等架构模式,策略模式能更好地提升代码质量。

    ”策略模式“在现实项目中的应用

    具体的场景在这个博客上,http://blog.csdn.net/zhylei/article/details/9042749,是现实中遇到的处理有确定方案和没有确定方案的场景问题,具体应用了设计模式中的“策略模式”

    设计模式在DOTA中的应用(策略模式)

    接下来,我们将深入探讨策略模式及其在DOTA中的具体应用。 策略模式的核心思想是定义一系列算法,并将每一个算法封装起来,使它们可以相互替换。每个算法都可以被视为一个策略,而策略之间是平等的。在DOTA中,每个...

    策略模式在android中使用

    策略模式是一种设计模式,主要应用于对象行为的设计,其核心思想是将不同的算法策略封装到独立的类中,这些类都实现一个公共的接口。...在实际项目中,我们应该善于利用策略模式来优化代码结构,提高代码质量。

    简单工厂模式VS策略模式小应用

    在实际应用中,简单工厂模式常用于创建一组相关的或相互依赖的对象,而策略模式则适用于需要在运行时根据条件选择不同行为的情况,如在游戏开发中选择不同的AI策略,或者在财务系统中根据用户等级选择不同的折扣策略...

    设计模式之策略模式 鸭子问题

    设计模式之策略模式 鸭子问题 策略模式是一种经典的设计模式,通过鸭子问题,可以让学习者更好地了解设计模式的概念和...通过鸭子问题,可以让学习者更好地了解策略模式的概念和实现,从而更好地应用于实际项目中。

    策略模式代码实现

    在实际应用中,策略模式常用于游戏规则、排序算法、支付方式等多种场景。例如,在电商系统中,不同的用户可能有不同的优惠策略,如满减、打折等,这时可以通过策略模式来实现,让系统根据用户类型动态选择合适的优惠...

    Spring项目整合策略模式~实战应用

    本实战应用将探讨如何在Spring项目中有效地整合策略模式,以提高代码的灵活性和可维护性。 首先,策略模式的核心概念是定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换。在Spring中,我们可以利用...

    Spring下使用策略模式

    在实际应用中,我们可能需要根据用户的选择或特定条件动态选择策略。Spring提供了`@Qualifier`注解或`@Resource`注解来指定特定的Bean,或者使用`ApplicationContext`在运行时获取Bean并设置策略。 此外,Spring ...

    策略模式demo例子

    这个压缩包文件"StrategyMarket"可能包含了一些关于如何在市场策略应用中实现策略模式的示例代码。 策略模式的核心思想是定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换。这些算法都遵循一个共同的...

    Java策略模式+案例

    通过这个案例,你可以看到策略模式如何在实际编程中应用,如何创建和使用策略对象,以及如何通过上下文来改变行为。这有助于深入理解策略模式,并能将其运用到自己的项目中,提高代码的灵活性和可维护性。

    工厂模式和策略模式

    在这个项目中,可能包含了一个或多个工厂类,用于创建不同的对象,同时也可能有相应的策略模式实现,用于在运行时根据需求选择不同的策略。测试代码可以帮助我们理解这些模式如何在实际场景中工作,以及如何通过单元...

    设计模式之策略模式(附demo)

    在实际应用中,策略模式常与工厂模式结合使用,由工厂类根据需求动态创建并返回策略对象。同时,策略模式也可以和其他设计模式如组合模式、装饰模式等结合,提供更复杂的行为控制。 通过阅读博文《设计模式之策略...

    Java 设计模式 策略模式

    在博客中提到的链接(可能已失效)中,作者详细解释了如何在实际项目中应用策略模式,包括代码示例和使用场景分析。对于初学者来说,这是一个很好的资源,可以帮助理解策略模式的工作原理和应用场景。如果你在阅读...

    java策略模式小例子

    在这个名为"java策略模式小例子"的项目中,我们可以预期看到一个简单的示例,演示了如何在Java中应用策略模式。`Strategy(Game)`可能包含了一些不同的策略类,每个类代表一种特定的游戏策略,以及一个上下文(Context...

    java设计模式之策略模式与模板模式

    在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 #### 核心概念 - **策略接口(Strategy Interface)**:定义了一组相关或相互排斥的操作。这些操作在不同的上下文中有...

    设计模式--策略模式StrategyPattern

    在实际应用中,策略模式常常用于游戏AI、财务计算、排序算法等场景。例如,在游戏中,角色的行为可以由多种策略决定,如攻击、防御、逃跑等,每种行为都是一个策略类;在财务计算中,不同税率的计算策略可以封装为...

Global site tag (gtag.js) - Google Analytics