策略模式

本文介绍如何使用策略模式设计统一数据库访问接口(UDBC),通过示例展示了针对不同数据库(如Oracle、Informix和DB2)的具体实现方法,并实现了算法与环境的解耦。

策略模式:是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。
环境类负责维持和查询行为类,各种算法在具体的策略类中提供。
由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。


 
假如现有一组访问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.} 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值