往往大师级别的设计是简单的,易懂的,可扩展的,从不做作,整齐的代码让阅读的人感到很舒服。最近在看一个开源项目的源码,其中有好多的设计思想可以借鉴,相信这些优雅的代码也是在大量实践基础上,通过不断的重构而形成的。有一小段代码自认为写的不错,以下是源码:
EPAdministratorImpl类中:
这里用匿名内部类对接口ParseRuleSelector进行实现,并加到static块中,在LoadClass的时候,初始化成员变量patternParseRule和eqlParseRule,是策略模式的实现方,而对于这两个成员变量的使用仅仅在该类里的一个方法中:
在其他地方这两个实现是不可用的,达到了很好的封装,因为ParseRuleSelector的目的就是选择EQLStatementParser的执行策略,不带有具体的业务数据,因此做成静态变量,使得对于一个Class仅有一个实例,节省内存。
在ParseHelper中的方法
调用接口,是面向接口编程,是策略模式的执行方,让具体的实现在EPAdministratorImpl中的匿名内部类完成。这样对于加入EQLStatementParser中的新方法,都可以在EPAdministratorImpl中对接口进行匿名实现,从而达到扩展的目的,并不需要改动ParseHelper。
EPAdministratorImpl类中:
java 代码
- private static ParseRuleSelector patternParseRule;
- private static ParseRuleSelector eqlParseRule;
- static
- {
- patternParseRule = new ParseRuleSelector()
- {
- public void invokeParseRule(EQLStatementParser parser) throws TokenStreamException, RecognitionException
- {
- parser.startPatternExpressionRule();
- }
- };
- eqlParseRule = new ParseRuleSelector()
- {
- public void invokeParseRule(EQLStatementParser parser) throws TokenStreamException, RecognitionException
- {
- parser.startEQLExpressionRule();
- }
- };
- }
这里用匿名内部类对接口ParseRuleSelector进行实现,并加到static块中,在LoadClass的时候,初始化成员变量patternParseRule和eqlParseRule,是策略模式的实现方,而对于这两个成员变量的使用仅仅在该类里的一个方法中:
java 代码
- AST ast = ParseHelper.parse(expression, patternParseRule);
在其他地方这两个实现是不可用的,达到了很好的封装,因为ParseRuleSelector的目的就是选择EQLStatementParser的执行策略,不带有具体的业务数据,因此做成静态变量,使得对于一个Class仅有一个实例,节省内存。
在ParseHelper中的方法
java 代码
- public static AST parse(String expression, ParseRuleSelector parseRuleSelector) throws EPException {
- EQLStatementLexer lexer = new EQLStatementLexer(new StringReader(expression));
- EQLStatementParser parser = new EQLStatementParser(lexer);
- parseRuleSelector.invokeParseRule(parser);
- }
调用接口,是面向接口编程,是策略模式的执行方,让具体的实现在EPAdministratorImpl中的匿名内部类完成。这样对于加入EQLStatementParser中的新方法,都可以在EPAdministratorImpl中对接口进行匿名实现,从而达到扩展的目的,并不需要改动ParseHelper。