Netty也研究了一段时间,实践是对知识掌握的试金石。有些东西只是看了面儿上的东西我觉得懂了,如不去深入,一旦要用它去做点什么东西却又觉得无从下手。学车的时候,学员问教练我怎么算是学会开车了,教练告诉他当你倒着开和向前开一样自如的时候就算学会了。怎么算掌握了一项技术呢?我的观点,多阅读源码,然后去实践,如此反复,读源码就像倒车。
已有 0 人发表留言,猛击->>这里<<-参与讨论
ITeye推荐
- —软件人才免语言低担保 赴美带薪读研!—
通常当一个语言需要解释执行,并且你可以将该语言的句子表示成为一个抽象的语法树时,可以使用解释器模式
解析
1)context:包含解释器之外的一些全局信息
2)AbstractExpression:抽象基类,声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享
3)TerminalExpression:终结符类,实现与文法中的终结符相关联的解释操作
4)NonterminalExpression:非终结符类,为文法中非终结符实现解释操作,对文法中每一条规则R1,R2...Rn都需要一个具体的非终结符类
小demointerpreter.h
#pragma once #include <iostream> #include <string> #include <vector> using namespace std; class Context; class AbstractExpression { public: virtual void Interpret(Context* contex) =0; }; class TerminalExpression : public AbstractExpression { public: virtual void Interpret(Context* contex) { cout<<"终端解释器"<<endl; } }; class NonterminalExpression : public AbstractExpression { public: virtual void Interpret(Context* contex) { cout<<"非终端解释器"<<endl; } }; class Context { public: string input; string output; };
main.cpp
#include "interpreter.h" #include <stdlib.h> void main() { Context* context=new Context(); vector<AbstractExpression*> express; express.push_back(new TerminalExpression()); express.push_back(new NonterminalExpression()); express.push_back(new NonterminalExpression()); vector<AbstractExpression*>::iterator iter=express.begin(); while(iter!=express.end()) { (*iter)->Interpret(context); iter++; } system("pause"); }
XML格式的数据解析式一个在应用开中很常见并且有时候很难处理的事情,虽然目前很多的开发平台,语言都提供了对XML格式数据的解析,但是例如到了移动终端设备上,由于处理速度,计算能力,存储容量的原因,解析XML格式的数据却是很复杂的一件事情,最近也提出了很多的移动设备的XML格式解析器,但是总体上在项目开发的时候还是需要自己去设计和实现这一过程。
Iterpreter模式则提供了一种很好的组织和设计这种解析器的架构。
Iterpreter模式中使用类来表示文法规则,因此可以很容易实现文法的扩展。另外对于终结符我们可以使用Flyweight模式来实现终结符的共享。
网上有很多关于SingleTon的用法说明及实现,大多都提供了很多种实现的方法,包括如何保证在多线程时也只提供一个实例。对于他的作用都是说只提供一个实例,但是到底有什么作用,对于我们这些初学者来说并不知道如何使用。经过自己的摸索,目前了解到了一些用法,不知道对不对,请高手们指点:
比如我们在程序中设置了一个主窗口:
public partial class DefaultWorkBench :From
{
public DefaultWorkBench()
{
InitializeComponent();
}
}
由于这个窗口我们只需要一个就行了,所以我们使用SingleTon模式。
public class WorkBenchSingleTon
{
private static DefaultWorkBench workBench=new DefaultWorkBench();
public static DefaultWorkBench WorkBench
{
get
{
if (workBench == null)
{
workBench = new DefaultWorkBench();
}
return workBench;
}
}
}
那么这有什么用呢?
我们在Main方法中:Application.Run(WorkBenchSingleTon.WorkBench)就相当于以前的Application.Run(new Form()),而如果我们还有其他的窗口或其他任何地方,需要调用到DefaultWorkBench窗口里面的函数或者控件,如果不使用这个模式,那么我们在另外的窗口的构造函数中需要传入DefaultWorkBench的实例,而现在我们只需要使用简单的:WorkBenchSingleTon.WorkBench.函数名或者属性或者控件就可以进行调用或设置了。特别是我们使用插件的方式进行开发的时候 ,其他的插件一般会和WorkBench进行通信,现在我们就可以在任何地方使用WorkBenchSingleTon.WorkBench来调用主窗口的一些控件的属性了。
在下一篇来介绍使用这种方式开发的插件框架。