策略模式:是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。
环境类负责维持和查询行为类,各种算法在具体的策略类中提供。
由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。
假如现有一组访问Oracle数据库的接口、一组访问Informix数据库的接口、一组访问DB2数据库的接口。请设计和实现一组统一数据库访问的接口(UDBC)。
[cpp] view plaincopyprint?
01.int db_ora_open(void **context){...}
02.int db_ora_rollback(void *context){...}
03....
int db_ora_open(void **context){...}
int db_ora_rollback(void *context){...}
...4.2 Informix访问接口
[cpp] view plaincopyprint?
01.int db_ifx_open(void **context){...}
02.int db_ifx_rollback(void *context){...}
03....
int db_ifx_open(void **context){...}
int db_ifx_rollback(void *context){...}
...4.3 DB2访问接口
[cpp] view plaincopyprint?
01.int db_db2_open(void **context){...}
02.int db_db2_rollback(void *context){...}
03....
int db_db2_open(void **context){...}
int db_db2_rollback(void *context){...}
...4.4 统一访问接口(UDBC)
[cpp] view plaincopyprint?
01.// 回调指针结构体
02.typedef struct
03.{
04. int (*db_open)(void**);
05. int (*db_rollback)(void*);
06. int (*db_mquery(const char *, void*);
07. int (*db_nquery(const char *, void*);
08. ...
09.}db_cb_ptr_t;
// 回调指针结构体
typedef struct
{
int (*db_open)(void**);
int (*db_rollback)(void*);
int (*db_mquery(const char *, void*);
int (*db_nquery(const char *, void*);
...
}db_cb_ptr_t;[cpp] view plaincopyprint?
01.// 定义&声明回调对象
02.db_cb_ptr_t g_db_cb_ptr;
// 定义&声明回调对象
db_cb_ptr_t g_db_cb_ptr;[cpp] view plaincopyprint?
01.// 数据库初始化
02.int db_init(db_type_t dbtype)
03.{
04. switch(dbtype)
05. {
06. case DB_TYPE_ORACLE:
07. {
08. // 设置Oracle回调
09. g_db_cb_ptr.db_open = db_ora_open;
10. g_db_cb_ptr.db_close = db_ora_close;
11. g_db_cb_ptr.db_rollback = db_ora_rollback;
12. g_db_cb_ptr.db_commit = db_ora_commit;
13. ...
14. break;
15. }
16. case DB_TYPE_INFORMIX:
17. {
18. // 设置Inofrmix回调
19. g_db_cb_ptr.db_open = db_ifx_open;
20. g_db_cb_ptr.db_close = db_ifx_close;
21. g_db_cb_ptr.db_rollback = db_ifx_rollback;
22. g_db_cb_ptr.db_commit = db_ifx_commit;
23. ...
24. break;
25. }
26. case DB_TYPE_DB2:
27. {
28. // 设置Db2回调
29. g_db_cb_ptr.db_open = db_db2_open;
30. g_db_cb_ptr.db_close = db_db2_close;
31. g_db_cb_ptr.db_rollback = db_db2_rollback;
32. g_db_cb_ptr.db_commit = db_db2_commit;
33. ...
34. break;
35. }
36. case ...:
37. {
38. ...
39. break;
40. }
41. }
42.
43. return 0;
44.}
45.
46.// 统一数据库接口(UDBC)
47.
48.// 连接数据库
49.int db_open(void **context)
50.{
51. return g_db_cb_ptr.db_open(context);
52.}
53.
54.//断开连接
55.int db_close(void *context)
56.{
57. return g_db_cb_ptr.db_open(context);
58.}
59.
60.//事务回滚
61.int db_rollback(void *context)
62.{
63. return g_db_cb_ptr.db_rollback(context);
64.}
65.
66.// 事务提交
67.int db_commit(void *context)
68.{
69. return g_db_cb_ptr.db_commit(context);
70.}
71....
72.
73.// Strategy模式接口的调用
74.int main(void)
75.{
76. void *context = NULL;
77. const char *sql = "INSERT INTO test_table VALUES(...)";
78.
79. db_init(DB_TYPE_ORACLE);
80. db_open(&context);
81. db_nquery(sql, context);
82. db_close(context);
83.
84. return 0;
85.}
本文介绍如何使用策略模式设计统一数据库访问接口(UDBC),通过示例展示了针对不同数据库(如Oracle、Informix和DB2)的具体实现方法,并实现了算法与环境的解耦。
1329

被折叠的 条评论
为什么被折叠?



