(原創) 試試看你手上對付問題有幾種武器!! (C/C++) (.NET) (C#)

四招解决跨数据库访问
本文探讨了四种解决跨数据库访问问题的方法:程序导向、物件继承、物件多型及物件泛型,通过C++和C#示例展示了各自实现方式及其优缺点。

GoF Design Pattern p.22說,物件導向對付問題有三種方法:1.物件繼承,2.物件多型,3.物件泛型,若加上程序導向,我們手中最少有四種武器對付問題,你會哪幾種呢?

一個簡單的需求,我們要抓資料,但資料同時可能在SQL Server,也可能在Oracle,將來還有可能有其他Database Server,所以我們必須最少實做兩種方式。

執行結果

None.gifGet Data from SQL Server
None.gifGet Data from Oracle


第一種,程序導向(Procedure Oriented)
C++

 1ExpandedBlockStart.gifContractedBlock.gif/**//* 
 2InBlock.gif(C) OOMusou 2007 http://oomusou.cnblogs.com
 3InBlock.gif
 4InBlock.gifFilename    : SQLOracle_Procedure.cpp
 5InBlock.gifCompiler    : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
 6InBlock.gifDescription : Demo how to solve problem by procedure 
 7InBlock.gifRelease     : 04/07/2007 1.0
 8ExpandedBlockEnd.gif*/

 9None.gif#include <iostream>
10None.gif
11None.gifusing namespace std;
12None.gif
13ExpandedBlockStart.gifContractedBlock.gifvoid getDataFromSQL() dot.gif{
14InBlock.gif  cout << "Get Data from SQL Server" << endl;  
15ExpandedBlockEnd.gif}

16None.gif
17ExpandedBlockStart.gifContractedBlock.gifvoid getDataFromOracle() dot.gif{
18InBlock.gif  cout << "Get Data from Oracle" << endl;
19ExpandedBlockEnd.gif}

20None.gif
21ExpandedBlockStart.gifContractedBlock.gifint main() dot.gif{
22InBlock.gif  getDataFromSQL();
23InBlock.gif  getDataFromOracle();
24ExpandedBlockEnd.gif}


C#

 1ExpandedBlockStart.gifContractedBlock.gif/**//* 
 2InBlock.gif(C) OOMusou 2007 http://oomusou.cnblogs.com
 3InBlock.gif
 4InBlock.gifFilename    : SQLOracle_Procedure.cs
 5InBlock.gifCompiler    : Visual Studio 2005 / C# 2.0
 6InBlock.gifDescription : Demo how to solve problem by procedure 
 7InBlock.gifRelease     : 04/07/2007 1.0
 8ExpandedBlockEnd.gif*/

 9None.gifusing System;
10None.gif
11ExpandedBlockStart.gifContractedBlock.gifclass main dot.gif{
12ExpandedSubBlockStart.gifContractedSubBlock.gif  public static void getDataFromSQL() dot.gif{
13InBlock.gif    Console.WriteLine("Get Data from SQL Server");
14ExpandedSubBlockEnd.gif  }

15InBlock.gif
16ExpandedSubBlockStart.gifContractedSubBlock.gif  public static void getDataFromOracle() dot.gif{
17InBlock.gif    Console.WriteLine("Get Data from Oracle");
18ExpandedSubBlockEnd.gif  }

19InBlock.gif  
20ExpandedSubBlockStart.gifContractedSubBlock.gif  public static void Main() dot.gif{
21InBlock.gif    getDataFromSQL();
22InBlock.gif    getDataFromOracle();
23ExpandedSubBlockEnd.gif  }

24ExpandedBlockEnd.gif}


第二種,物件繼承(Object Inheritance)

C++

 1ExpandedBlockStart.gifContractedBlock.gif/**//* 
 2InBlock.gif(C) OOMusou 2007 http://oomusou.cnblogs.com
 3InBlock.gif
 4InBlock.gifFilename    : SQLOracle_OO_Inheritance.cpp
 5InBlock.gifCompiler    : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
 6InBlock.gifDescription : Demo how to solve problem by Object Inheritance
 7InBlock.gifRelease     : 04/07/2007 1.0
 8ExpandedBlockEnd.gif*/

 9None.gif#include <iostream>
10None.gif
11None.gifusing namespace std;
12None.gif
13ExpandedBlockStart.gifContractedBlock.gifclass DBManager dot.gif{
14InBlock.gifpublic:
15ExpandedSubBlockStart.gifContractedSubBlock.gif  void getData() dot.gif{
16InBlock.gif    this->getDataFromDB();
17ExpandedSubBlockEnd.gif  }

18InBlock.gif  
19InBlock.gifprotected:
20ExpandedSubBlockStart.gifContractedSubBlock.gif  virtual void getDataFromDB() dot.gif{}
21ExpandedBlockEnd.gif}
;
22None.gif
23ExpandedBlockStart.gifContractedBlock.gifclass SQLDBManager : public DBManager dot.gif{
24InBlock.gifprotected:
25ExpandedSubBlockStart.gifContractedSubBlock.gif  void getDataFromDB() dot.gif{
26InBlock.gif    cout << "Get Data from SQL Server" << endl;  
27ExpandedSubBlockEnd.gif  }

28ExpandedBlockEnd.gif}
;
29None.gif
30ExpandedBlockStart.gifContractedBlock.gifclass OracleDBManager : public DBManager dot.gif{
31InBlock.gifprotected:
32ExpandedSubBlockStart.gifContractedSubBlock.gif  void getDataFromDB() dot.gif{
33InBlock.gif    cout << "Get Data from Oracle" << endl;
34ExpandedSubBlockEnd.gif  }

35ExpandedBlockEnd.gif}
;
36None.gif
37ExpandedBlockStart.gifContractedBlock.gifint main() dot.gif{
38InBlock.gif  DBManager* theDBManager = &SQLDBManager();
39InBlock.gif  theDBManager->getData();
40InBlock.gif  
41InBlock.gif  theDBManager = &OracleDBManager();
42InBlock.gif  theDBManager->getData();
43ExpandedBlockEnd.gif}


C#

 1ExpandedBlockStart.gifContractedBlock.gif/**//* 
 2InBlock.gif(C) OOMusou 2007 http://oomusou.cnblogs.com
 3InBlock.gif
 4InBlock.gifFilename    : SQLOracle_OO_Inheritance.cs
 5InBlock.gifCompiler    : Visual Studio 2005 / C# 2.0
 6InBlock.gifDescription : Demo how to solve problem by Object Inheritance
 7InBlock.gifRelease     : 04/07/2007 1.0
 8ExpandedBlockEnd.gif*/

 9None.gifusing System;
10None.gif
11ExpandedBlockStart.gifContractedBlock.gifclass DBManager dot.gif{
12ExpandedSubBlockStart.gifContractedSubBlock.gif  public void getData() dot.gif{
13InBlock.gif    this.getDataFromDB();
14ExpandedSubBlockEnd.gif  }

15InBlock.gif  
16ExpandedSubBlockStart.gifContractedSubBlock.gif  protected virtual void getDataFromDB() dot.gif{}
17ExpandedBlockEnd.gif}

18None.gif
19ExpandedBlockStart.gifContractedBlock.gifclass SQLDBManager : DBManager dot.gif{
20ExpandedSubBlockStart.gifContractedSubBlock.gif  protected override void getDataFromDB() dot.gif{
21InBlock.gif    Console.WriteLine("Get Data from SQL Server");
22ExpandedSubBlockEnd.gif  }

23ExpandedBlockEnd.gif}

24None.gif
25ExpandedBlockStart.gifContractedBlock.gifclass OracleDBManager : DBManager dot.gif{
26ExpandedSubBlockStart.gifContractedSubBlock.gif  protected override void getDataFromDB() dot.gif{
27InBlock.gif    Console.WriteLine("Get Data from Oracle");
28ExpandedSubBlockEnd.gif  }

29ExpandedBlockEnd.gif}

30None.gif
31ExpandedBlockStart.gifContractedBlock.gifclass main dot.gif{
32ExpandedSubBlockStart.gifContractedSubBlock.gif  public static void Main() dot.gif{
33InBlock.gif    DBManager theDBManager = new SQLDBManager();
34InBlock.gif    theDBManager.getData();
35InBlock.gif  
36InBlock.gif    theDBManager = new OracleDBManager();
37InBlock.gif    theDBManager.getData();
38ExpandedSubBlockEnd.gif  }

39ExpandedBlockEnd.gif}


第三種,物件多型(Object Polymorphism)

C++

 1ExpandedBlockStart.gifContractedBlock.gif/**//* 
 2InBlock.gif(C) OOMusou 2007 http://oomusou.cnblogs.com
 3InBlock.gif
 4InBlock.gifFilename    : SQLOracle_OO_Polymorphism.cpp
 5InBlock.gifCompiler    : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
 6InBlock.gifDescription : Demo how to solve problem by Object Polymorphism
 7InBlock.gifRelease     : 04/07/2007 1.0
 8ExpandedBlockEnd.gif*/

 9None.gif#include <iostream>
10None.gif
11None.gifusing namespace std;
12None.gif
13ExpandedBlockStart.gifContractedBlock.gifclass IDBServer dot.gif{
14InBlock.gifpublic:
15InBlock.gif  virtual void getDataFromDB() = 0;
16ExpandedBlockEnd.gif}
;
17None.gif
18ExpandedBlockStart.gifContractedBlock.gifclass DBManager dot.gif{
19InBlock.gifprivate:
20InBlock.gif  IDBServer* dBServer;
21InBlock.gif  
22InBlock.gifpublic:
23ExpandedSubBlockStart.gifContractedSubBlock.gif  DBManager() dot.gif{}
24ExpandedSubBlockStart.gifContractedSubBlock.gif  DBManager(IDBServer& dBServer) : dBServer(&dBServer) dot.gif{}
25InBlock.gif  
26InBlock.gifpublic:
27ExpandedSubBlockStart.gifContractedSubBlock.gif  void getData() dot.gif{
28InBlock.gif    this->dBServer->getDataFromDB();
29ExpandedSubBlockEnd.gif  }

30ExpandedBlockEnd.gif}
;
31None.gif
32ExpandedBlockStart.gifContractedBlock.gifclass SQLServer : public IDBServer dot.gif{
33InBlock.gifpublic:
34ExpandedSubBlockStart.gifContractedSubBlock.gif  void getDataFromDB() dot.gif{
35InBlock.gif    cout << "Get Data from SQL Server" << endl;  
36ExpandedSubBlockEnd.gif  }

37ExpandedBlockEnd.gif}
;
38None.gif
39ExpandedBlockStart.gifContractedBlock.gifclass Oracle : public IDBServer dot.gif{
40InBlock.gifpublic:
41ExpandedSubBlockStart.gifContractedSubBlock.gif  void getDataFromDB() dot.gif{
42InBlock.gif    cout << "Get Data from Oracle" << endl;
43ExpandedSubBlockEnd.gif  }

44ExpandedBlockEnd.gif}
;
45None.gif
46ExpandedBlockStart.gifContractedBlock.gifint main() dot.gif{
47InBlock.gif  DBManager& theDBManager = DBManager(SQLServer());
48InBlock.gif  theDBManager.getData();
49InBlock.gif  
50InBlock.gif  theDBManager = DBManager(Oracle());
51InBlock.gif  theDBManager.getData();
52ExpandedBlockEnd.gif}


C#

 1ExpandedBlockStart.gifContractedBlock.gif/**//* 
 2InBlock.gif(C) OOMusou 2007 http://oomusou.cnblogs.com
 3InBlock.gif
 4InBlock.gifFilename    : SQLOracle_OO_Polymorphism.cs
 5InBlock.gifCompiler    : Visual Studio 2005 / C# 2.0
 6InBlock.gifDescription : Demo how to solve problem by Object Polymorphism
 7InBlock.gifRelease     : 04/07/2007 1.0
 8ExpandedBlockEnd.gif*/

 9None.gifusing System;
10None.gif
11ExpandedBlockStart.gifContractedBlock.gifinterface IDBServer dot.gif{
12InBlock.gif  void getDataFromDB();
13ExpandedBlockEnd.gif}

14None.gif
15ExpandedBlockStart.gifContractedBlock.gifclass DBManager dot.gif{
16InBlock.gif  private IDBServer dBServer;
17InBlock.gif  
18ExpandedSubBlockStart.gifContractedSubBlock.gif  public DBManager() dot.gif{}
19ExpandedSubBlockStart.gifContractedSubBlock.gif  public DBManager(IDBServer dBServer) dot.gif{
20InBlock.gif    this.dBServer = dBServer;
21ExpandedSubBlockEnd.gif  }

22InBlock.gif  
23ExpandedSubBlockStart.gifContractedSubBlock.gif  public void getData() dot.gif{
24InBlock.gif    this.dBServer.getDataFromDB();
25ExpandedSubBlockEnd.gif  }

26ExpandedBlockEnd.gif}

27None.gif
28ExpandedBlockStart.gifContractedBlock.gifclass SQLServer : IDBServer dot.gif{
29ExpandedSubBlockStart.gifContractedSubBlock.gif  public void getDataFromDB() dot.gif{
30InBlock.gif    Console.WriteLine("Get Data from SQL Server"); 
31ExpandedSubBlockEnd.gif  }

32ExpandedBlockEnd.gif}

33None.gif
34ExpandedBlockStart.gifContractedBlock.gifclass Oracle : IDBServer dot.gif{
35ExpandedSubBlockStart.gifContractedSubBlock.gif  public void getDataFromDB() dot.gif{
36InBlock.gif    Console.WriteLine("Get Data from Oracle");
37ExpandedSubBlockEnd.gif  }

38ExpandedBlockEnd.gif}

39None.gif
40ExpandedBlockStart.gifContractedBlock.gifclass main dot.gif{
41ExpandedSubBlockStart.gifContractedSubBlock.gif  public static void Main() dot.gif{
42InBlock.gif    DBManager theDBManager = new DBManager(new SQLServer());
43InBlock.gif    theDBManager.getData();
44InBlock.gif  
45InBlock.gif    theDBManager = new DBManager(new Oracle());
46InBlock.gif    theDBManager.getData();
47ExpandedSubBlockEnd.gif  }

48ExpandedBlockEnd.gif}


第四種,物件泛型 (Object Generic)

C++

 1ExpandedBlockStart.gifContractedBlock.gif/**//* 
 2InBlock.gif(C) OOMusou 2007 http://oomusou.cnblogs.com
 3InBlock.gif
 4InBlock.gifFilename    : SQLOracle_GP_template.cpp
 5InBlock.gifCompiler    : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
 6InBlock.gifDescription : Demo how to solve problem by template
 7InBlock.gifRelease     : 04/07/2007 1.0
 8ExpandedBlockEnd.gif*/
 9None.gif#include <iostream>
10None.gif
11None.gifusing namespace std;
12None.gif
13None.giftemplate <typename T>
14ExpandedBlockStart.gifContractedBlock.gifclass DBManager dot.gif{
15InBlock.gifprivate:
16InBlock.gif  T* dBServer; 
17InBlock.gif  
18InBlock.gifpublic:
19ExpandedSubBlockStart.gifContractedSubBlock.gif  void getData() dot.gif{
20InBlock.gif    this->dBServer->getDataFromDB();
21ExpandedSubBlockEnd.gif  }

22ExpandedBlockEnd.gif}
;
23None.gif
24ExpandedBlockStart.gifContractedBlock.gifclass SQLServer dot.gif{
25InBlock.gifpublic:
26ExpandedSubBlockStart.gifContractedSubBlock.gif  void getDataFromDB() dot.gif{
27InBlock.gif    cout << "Get Data from SQL Server" << endl;  
28ExpandedSubBlockEnd.gif  }

29ExpandedBlockEnd.gif}
;
30None.gif
31ExpandedBlockStart.gifContractedBlock.gifclass Oracle dot.gif{
32InBlock.gifpublic:
33ExpandedSubBlockStart.gifContractedSubBlock.gif  void getDataFromDB() dot.gif{
34InBlock.gif    cout << "Get Data from Oracle" << endl;
35ExpandedSubBlockEnd.gif  }

36ExpandedBlockEnd.gif}
;
37None.gif
38ExpandedBlockStart.gifContractedBlock.gifint main() dot.gif{
39InBlock.gif  DBManager<SQLServer> theDBManager1;
40InBlock.gif  theDBManager1.getData();
41InBlock.gif  
42InBlock.gif  DBManager<Oracle> theDBManager2;
43InBlock.gif  theDBManager2.getData();
44ExpandedBlockEnd.gif}


C#

 1ExpandedBlockStart.gifContractedBlock.gif/**//* 
 2InBlock.gif(C) OOMusou 2007 http://oomusou.cnblogs.com
 3InBlock.gif
 4InBlock.gifFilename    : SQLOracle_GP_Generic.cs
 5InBlock.gifCompiler    : Visual Studio 2005 / C# 2.0
 6InBlock.gifDescription : Demo how to solve problem by Generic
 7InBlock.gifRelease     : 04/07/2007 1.0
 8ExpandedBlockEnd.gif*/

 9None.gifusing System;
10ExpandedBlockStart.gifContractedBlock.gifinterface IDBServer dot.gif{
11InBlock.gif  void getDataFromDB();
12ExpandedBlockEnd.gif}

13None.gif
14ExpandedBlockStart.gifContractedBlock.gifclass DBManager<T> where T : IDBServer, new()dot.gif{
15InBlock.gif  private T dBServer; 
16InBlock.gif  
17ExpandedSubBlockStart.gifContractedSubBlock.gif  public DBManager() dot.gif{
18InBlock.gif    this.dBServer = new T();
19ExpandedSubBlockEnd.gif  }

20InBlock.gif  
21ExpandedSubBlockStart.gifContractedSubBlock.gif  public void getData() dot.gif{
22InBlock.gif    this.dBServer.getDataFromDB();
23ExpandedSubBlockEnd.gif  }

24ExpandedBlockEnd.gif}

25None.gif
26ExpandedBlockStart.gifContractedBlock.gifclass SQLServer : IDBServerdot.gif{
27ExpandedSubBlockStart.gifContractedSubBlock.gif  public void getDataFromDB() dot.gif{
28InBlock.gif    Console.WriteLine("Get Data from SQL Server");
29ExpandedSubBlockEnd.gif  }

30ExpandedBlockEnd.gif}

31None.gif
32ExpandedBlockStart.gifContractedBlock.gifclass Oracle : IDBServerdot.gif{
33ExpandedSubBlockStart.gifContractedSubBlock.gif  public void getDataFromDB() dot.gif{
34InBlock.gif    Console.WriteLine("Get Data from Oracle");
35ExpandedSubBlockEnd.gif  }

36ExpandedBlockEnd.gif}

37None.gif
38ExpandedBlockStart.gifContractedBlock.gifclass main dot.gif{
39ExpandedSubBlockStart.gifContractedSubBlock.gif  public static void Main() dot.gif{
40InBlock.gif    DBManager<SQLServer> theDBManager1 = new DBManager<SQLServer>();
41InBlock.gif    theDBManager1.getData();
42InBlock.gif
43InBlock.gif    DBManager<Oracle> theDBManager2 = new DBManager<Oracle>();
44InBlock.gif    theDBManager2.getData();
45ExpandedSubBlockEnd.gif  }

46ExpandedBlockEnd.gif}


Conclusion
同一種問題,用不同方式實做,各有各的優缺點,不過通常以彈性跟好維護來說,泛型 > 多型 >> 繼承 >> 程序,你手上有多少武器呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值