`
chillwarmoon
  • 浏览: 153783 次
  • 性别: 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  
弱弱的问下,实例中就两个策略类,如果策略较多咋办

相关推荐

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

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

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

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

    ActionScript 3.0设计模式扫描版_方红琴译

    策略模式使用的主要OOP概念 最小抽象策略模式 添加更多的具体策略和具体上下文环境 使用字符串策略 小结 第Ⅴ部分 复合模式 第12章 模型-视图-控制器模式 什么是模型-视图-控制器(MVC)模式? MVC元素间的...

    php设计模式之策略模式应用案例详解

    主要介绍了php设计模式之策略模式,结合具体应用案例形式详细分析了php策略模式的原理、定义、实现方法及项目应用案例与操作注意事项,需要的朋友可以参考下

    UML和模式应用(架构师必备).part02.rar

    17.9 在对象设计中应用GRASP 17.10 创建者 17.11 信息专家(或专家) 17.12 低耦合 17.13 控制器 17.14 高内聚 17.15 参考资料 第18章 使用GRASP的对象设计示例 18.1 什么是用例实现 18.2 制品注释 18.3 ...

    Learning+PHP设计模式

    本书利用大量浅显易懂的例子告诉你如何应用多种面向对象模式,并展示了这些模式在一些成熟的实际项目中的具体应用。 需要学习这些可重用的模式如何帮助你解决复杂的问题,如何组织面向对象代码,以及只改变一些小...

    UML和模式应用(架构师必备).part06.rar

    17.9 在对象设计中应用GRASP 17.10 创建者 17.11 信息专家(或专家) 17.12 低耦合 17.13 控制器 17.14 高内聚 17.15 参考资料 第18章 使用GRASP的对象设计示例 18.1 什么是用例实现 18.2 制品注释 18.3 ...

    应用型本科人才培养模式改革探索.doc

    在高等教育事业的发展中,新型教学模式的研究和实践已经成为我国高等教育教学改革的热点。应用型本科人才培养模式改革探索是当前高等教育领域的热点问题之一。本文提出“3+1”人才培养模式,旨在解决传统教学模式...

    二十三种设计模式【PDF版】

    整体结构和一些主要职责(如数据库操作 事务跟踪 安全等),剩余的就是变化的东西,针对这个领域中具体应用产生的具体不同 的变化需求,而这些变化东西就是 J2EE 程序员所要做的。 由此可见,设计模式和 J2EE 在思想...

    昆明市信息化建设项目建设方案和投资概算编制要求.pdf

    知识点详解:在项目管理中,项目建设单位是项目的实施主体,项目责任人是项目的直接责任人,项目实施机构是项目的执行机构。领导和管理机构是项目的管理机构,负责项目的实施和监督。 2. 投资概算编制:投资概算...

    UML和模式应用(架构师必备).part01.rar

    17.9 在对象设计中应用GRASP 17.10 创建者 17.11 信息专家(或专家) 17.12 低耦合 17.13 控制器 17.14 高内聚 17.15 参考资料 第18章 使用GRASP的对象设计示例 18.1 什么是用例实现 18.2 制品注释 18.3 ...

    UML和模式应用(架构师必备).part07.rar

    17.9 在对象设计中应用GRASP 17.10 创建者 17.11 信息专家(或专家) 17.12 低耦合 17.13 控制器 17.14 高内聚 17.15 参考资料 第18章 使用GRASP的对象设计示例 18.1 什么是用例实现 18.2 制品注释 18.3 ...

    UML和模式应用(架构师必备).part03.rar

    17.9 在对象设计中应用GRASP 17.10 创建者 17.11 信息专家(或专家) 17.12 低耦合 17.13 控制器 17.14 高内聚 17.15 参考资料 第18章 使用GRASP的对象设计示例 18.1 什么是用例实现 18.2 制品注释 18.3 ...

    UML和模式应用(架构师必备).part04.rar

    17.9 在对象设计中应用GRASP 17.10 创建者 17.11 信息专家(或专家) 17.12 低耦合 17.13 控制器 17.14 高内聚 17.15 参考资料 第18章 使用GRASP的对象设计示例 18.1 什么是用例实现 18.2 制品注释 18.3 ...

    UML和模式应用(架构师必备).part08.rar

    17.9 在对象设计中应用GRASP 17.10 创建者 17.11 信息专家(或专家) 17.12 低耦合 17.13 控制器 17.14 高内聚 17.15 参考资料 第18章 使用GRASP的对象设计示例 18.1 什么是用例实现 18.2 制品注释 18.3 ...

    UML和模式应用(架构师必备).part05.rar

    17.9 在对象设计中应用GRASP 17.10 创建者 17.11 信息专家(或专家) 17.12 低耦合 17.13 控制器 17.14 高内聚 17.15 参考资料 第18章 使用GRASP的对象设计示例 18.1 什么是用例实现 18.2 制品注释 18.3 ...

    挑战杯创业项目计划书[获奖].doc

    在目录中,第一章执行概要是企业创业的总体概述,涵盖了创意背景、公司简介、产品分析、市场分析、投资、财务和风险分析等方面的内容。这些内容都是企业创业的重要组成部分,每个部分都需要企业家和创业者认真考虑和...

    信息化项目建设实施计划方案编写的指南.doc

    信息化项目建设实施计划方案编写指南 本文档旨在为信息化项目建设实施计划方案的编写提供指南,...*应用推广:充分说明项目的推广应用围,使用人员培训计划,跨部门、跨地区项目须详细描述试点推广模式和推进方案。

    asp.net知识库

    也论该不该在项目中使用存储过程代替SQL语句 如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典信息 C#中利用GetOleDbSchemaTable获取数据库内表信息...

Global site tag (gtag.js) - Google Analytics