-
Notifications
You must be signed in to change notification settings - Fork 1
Design Pattern
服务器与客户端间的通信高度依赖json的传输,在服务器端,解析接收到的json中的信息、响应客户端的请求实现复杂操作并回传数据是一项非常冗杂的任务。为了整合服务器端所有的请求处理操作,我们定义了handle基类,提供了统一的deal()接口,并继承出appointhdl等子类对接口进行具体实现,最大程度实现代码的复用。
socketThread类是多线程网络通信中的核心,在服务器和客户端中均有使用,它继承自支持多线程的QRunnable类,同时组合了保证线程安全的QMutex类和进行网络通信的QTcpSocket类,能较好地整合和控制网络通信的过程。
在我们使用的库中有一个叫QDaemon,用来实现守护进程,但是它不支持自定义控制的命令行。为此我们也写了一个名为cmdParser的类,用于将我们自己规定的命令行转换成QDaemon内部的标准,暴露给用户的只有我们自己定义的命令行接口。
服务器中一些服务是全局适用的,不适合创建多个对象,对这些服务我们使用了单例模式,如负责配置文件读取和加载并提供配置值给其他服务的config类、负责数据库连接的dbConn类、维护用户全局token的ctrlhdl类。这些类不能直接使用全局变量,因为它们在不同的编译单元中,无法保证它们初始化的顺序。但是我们要求必须先初始化config之后才能去初始化其他类。所以我们使用单例模式,并通过代码的先后顺序来控制它们的初始化顺序。 我们使用惰性初始化的方法,当调用getInstance()方法的时候才去初始化对象。对象的构造函数是私有的,拷贝构造函数和赋值运算符均被置为删除,防止单例对象被拷贝;析构函数也是私有的,防止用户非法删除单例类。为了释放内存,我们在单例类内嵌了一个Garbo类用以删除单例类。Garbo类是单例类的类内静态成员,当程序将要退出的时候会调用Garbo类的析构函数,而该析构函数又会去删除单例对象。