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

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

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

執行結果

Get Data from SQL Server
Get Data from Oracle


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

 1/* 
 2(C) OOMusou 2007 http://oomusou.cnblogs.com
 3
 4Filename    : SQLOracle_Procedure.cpp
 5Compiler    : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
 6Description : Demo how to solve problem by procedure 
 7Release     : 04/07/2007 1.0
 8*/

 9#include <iostream>
10
11using namespace std;
12
13void getDataFromSQL() {
14  cout << "Get Data from SQL Server" << endl;  
15}

16
17void getDataFromOracle() {
18  cout << "Get Data from Oracle" << endl;
19}

20
21int main() {
22  getDataFromSQL();
23  getDataFromOracle();
24}


C#

 1/* 
 2(C) OOMusou 2007 http://oomusou.cnblogs.com
 3
 4Filename    : SQLOracle_Procedure.cs
 5Compiler    : Visual Studio 2005 / C# 2.0
 6Description : Demo how to solve problem by procedure 
 7Release     : 04/07/2007 1.0
 8*/

 9using System;
10
11class main {
12  public static void getDataFromSQL() {
13    Console.WriteLine("Get Data from SQL Server");
14  }

15
16  public static void getDataFromOracle() {
17    Console.WriteLine("Get Data from Oracle");
18  }

19  
20  public static void Main() {
21    getDataFromSQL();
22    getDataFromOracle();
23  }

24}


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

C++

 1/* 
 2(C) OOMusou 2007 http://oomusou.cnblogs.com
 3
 4Filename    : SQLOracle_OO_Inheritance.cpp
 5Compiler    : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
 6Description : Demo how to solve problem by Object Inheritance
 7Release     : 04/07/2007 1.0
 8*/

 9#include <iostream>
10
11using namespace std;
12
13class DBManager {
14public:
15  void getData() {
16    this->getDataFromDB();
17  }

18  
19protected:
20  virtual void getDataFromDB() {}
21}
;
22
23class SQLDBManager : public DBManager {
24protected:
25  void getDataFromDB() {
26    cout << "Get Data from SQL Server" << endl;  
27  }

28}
;
29
30class OracleDBManager : public DBManager {
31protected:
32  void getDataFromDB() {
33    cout << "Get Data from Oracle" << endl;
34  }

35}
;
36
37int main() {
38  DBManager* theDBManager = &SQLDBManager();
39  theDBManager->getData();
40  
41  theDBManager = &OracleDBManager();
42  theDBManager->getData();
43}


C#

 1/* 
 2(C) OOMusou 2007 http://oomusou.cnblogs.com
 3
 4Filename    : SQLOracle_OO_Inheritance.cs
 5Compiler    : Visual Studio 2005 / C# 2.0
 6Description : Demo how to solve problem by Object Inheritance
 7Release     : 04/07/2007 1.0
 8*/

 9using System;
10
11class DBManager {
12  public void getData() {
13    this.getDataFromDB();
14  }

15  
16  protected virtual void getDataFromDB() {}
17}

18
19class SQLDBManager : DBManager {
20  protected override void getDataFromDB() {
21    Console.WriteLine("Get Data from SQL Server");
22  }

23}

24
25class OracleDBManager : DBManager {
26  protected override void getDataFromDB() {
27    Console.WriteLine("Get Data from Oracle");
28  }

29}

30
31class main {
32  public static void Main() {
33    DBManager theDBManager = new SQLDBManager();
34    theDBManager.getData();
35  
36    theDBManager = new OracleDBManager();
37    theDBManager.getData();
38  }

39}


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

C++

 1/* 
 2(C) OOMusou 2007 http://oomusou.cnblogs.com
 3
 4Filename    : SQLOracle_OO_Polymorphism.cpp
 5Compiler    : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
 6Description : Demo how to solve problem by Object Polymorphism
 7Release     : 04/07/2007 1.0
 8*/

 9#include <iostream>
10
11using namespace std;
12
13class IDBServer {
14public:
15  virtual void getDataFromDB() = 0;
16}
;
17
18class DBManager {
19private:
20  IDBServer* dBServer;
21  
22public:
23  DBManager() {}
24  DBManager(IDBServer& dBServer) : dBServer(&dBServer) {}
25  
26public:
27  void getData() {
28    this->dBServer->getDataFromDB();
29  }

30}
;
31
32class SQLServer : public IDBServer {
33public:
34  void getDataFromDB() {
35    cout << "Get Data from SQL Server" << endl;  
36  }

37}
;
38
39class Oracle : public IDBServer {
40public:
41  void getDataFromDB() {
42    cout << "Get Data from Oracle" << endl;
43  }

44}
;
45
46int main() {
47  DBManager& theDBManager = DBManager(SQLServer());
48  theDBManager.getData();
49  
50  theDBManager = DBManager(Oracle());
51  theDBManager.getData();
52}


C#

 1/* 
 2(C) OOMusou 2007 http://oomusou.cnblogs.com
 3
 4Filename    : SQLOracle_OO_Polymorphism.cs
 5Compiler    : Visual Studio 2005 / C# 2.0
 6Description : Demo how to solve problem by Object Polymorphism
 7Release     : 04/07/2007 1.0
 8*/

 9using System;
10
11interface IDBServer {
12  void getDataFromDB();
13}

14
15class DBManager {
16  private IDBServer dBServer;
17  
18  public DBManager() {}
19  public DBManager(IDBServer dBServer) {
20    this.dBServer = dBServer;
21  }

22  
23  public void getData() {
24    this.dBServer.getDataFromDB();
25  }

26}

27
28class SQLServer : IDBServer {
29  public void getDataFromDB() {
30    Console.WriteLine("Get Data from SQL Server"); 
31  }

32}

33
34class Oracle : IDBServer {
35  public void getDataFromDB() {
36    Console.WriteLine("Get Data from Oracle");
37  }

38}

39
40class main {
41  public static void Main() {
42    DBManager theDBManager = new DBManager(new SQLServer());
43    theDBManager.getData();
44  
45    theDBManager = new DBManager(new Oracle());
46    theDBManager.getData();
47  }

48}


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

C++

 1/* 
 2(C) OOMusou 2007 http://oomusou.cnblogs.com
 3
 4Filename    : SQLOracle_GP_template.cpp
 5Compiler    : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
 6Description : Demo how to solve problem by template
 7Release     : 04/07/2007 1.0
 8*/

 9#include <iostream>
10
11using namespace std;
12
13template <typename T>
14class DBManager {
15private:
16  T* dBServer; 
17  
18public:
19  void getData() {
20    this->dBServer->getDataFromDB();
21  }

22}
;
23
24class SQLServer {
25public:
26  void getDataFromDB() {
27    cout << "Get Data from SQL Server" << endl;  
28  }

29}
;
30
31class Oracle {
32public:
33  void getDataFromDB() {
34    cout << "Get Data from Oracle" << endl;
35  }

36}
;
37
38int main() {
39  DBManager<SQLServer> theDBManager1;
40  theDBManager1.getData();
41  
42  DBManager<Oracle> theDBManager2;
43  theDBManager2.getData();
44}


C#

 1/* 
 2(C) OOMusou 2007 http://oomusou.cnblogs.com
 3
 4Filename    : SQLOracle_GP_Generic.cs
 5Compiler    : Visual Studio 2005 / C# 2.0
 6Description : Demo how to solve problem by Generic
 7Release     : 04/07/2007 1.0
 8*/

 9using System;
10interface IDBServer {
11  void getDataFromDB();
12}

13
14class DBManager<T> where T : IDBServer, new(){
15  private T dBServer; 
16  
17  public DBManager() {
18    this.dBServer = new T();
19  }

20  
21  public void getData() {
22    this.dBServer.getDataFromDB();
23  }

24}

25
26class SQLServer : IDBServer{
27  public void getDataFromDB() {
28    Console.WriteLine("Get Data from SQL Server");
29  }

30}

31
32class Oracle : IDBServer{
33  public void getDataFromDB() {
34    Console.WriteLine("Get Data from Oracle");
35  }

36}

37
38class main {
39  public static void Main() {
40    DBManager<SQLServer> theDBManager1 = new DBManager<SQLServer>();
41    theDBManager1.getData();
42
43    DBManager<Oracle> theDBManager2 = new DBManager<Oracle>();
44    theDBManager2.getData();
45  }

46}


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

posted on 2007-04-08 01:23  真 OO无双  阅读(1252)  评论(0编辑  收藏  举报

导航