(原創) 試試看你手上對付問題有幾種武器!! (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
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}
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}
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}
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}
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}
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}
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}
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}
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
同一種問題,用不同方式實做,各有各的優缺點,不過通常以彈性跟好維護來說,泛型 > 多型 >> 繼承 >> 程序,你手上有多少武器呢?