(原創) 試試看你手上對付問題有幾種武器!! (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
4
Filename : SQLOracle_Procedure.cpp
5
Compiler : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
6
Description : Demo how to solve problem by procedure
7
Release : 04/07/2007 1.0
8
*/
9
#include <iostream>
10
11
using namespace std;
12
13
void getDataFromSQL() {
14
cout << "Get Data from SQL Server" << endl;
15
}
16
17
void getDataFromOracle() {
18
cout << "Get Data from Oracle" << endl;
19
}
20
21
int main() {
22
getDataFromSQL();
23
getDataFromOracle();
24
}
/* 2
(C) OOMusou 2007 http://oomusou.cnblogs.com3

4
Filename : SQLOracle_Procedure.cpp5
Compiler : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++6
Description : Demo how to solve problem by procedure 7
Release : 04/07/2007 1.08
*/9
#include <iostream>10

11
using namespace std;12

13
void getDataFromSQL() {14
cout << "Get Data from SQL Server" << endl; 15
}16

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

21
int main() {22
getDataFromSQL();23
getDataFromOracle();24
}
C#
1
/*
2
(C) OOMusou 2007 http://oomusou.cnblogs.com
3
4
Filename : SQLOracle_Procedure.cs
5
Compiler : Visual Studio 2005 / C# 2.0
6
Description : Demo how to solve problem by procedure
7
Release : 04/07/2007 1.0
8
*/
9
using System;
10
11
class 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.com3

4
Filename : SQLOracle_Procedure.cs5
Compiler : Visual Studio 2005 / C# 2.06
Description : Demo how to solve problem by procedure 7
Release : 04/07/2007 1.08
*/9
using System;10

11
class 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
4
Filename : SQLOracle_OO_Inheritance.cpp
5
Compiler : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
6
Description : Demo how to solve problem by Object Inheritance
7
Release : 04/07/2007 1.0
8
*/
9
#include <iostream>
10
11
using namespace std;
12
13
class DBManager {
14
public:
15
void getData() {
16
this->getDataFromDB();
17
}
18
19
protected:
20
virtual void getDataFromDB() {}
21
};
22
23
class SQLDBManager : public DBManager {
24
protected:
25
void getDataFromDB() {
26
cout << "Get Data from SQL Server" << endl;
27
}
28
};
29
30
class OracleDBManager : public DBManager {
31
protected:
32
void getDataFromDB() {
33
cout << "Get Data from Oracle" << endl;
34
}
35
};
36
37
int main() {
38
DBManager* theDBManager = &SQLDBManager();
39
theDBManager->getData();
40
41
theDBManager = &OracleDBManager();
42
theDBManager->getData();
43
}
/* 2
(C) OOMusou 2007 http://oomusou.cnblogs.com3

4
Filename : SQLOracle_OO_Inheritance.cpp5
Compiler : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++6
Description : Demo how to solve problem by Object Inheritance7
Release : 04/07/2007 1.08
*/9
#include <iostream>10

11
using namespace std;12

13
class DBManager {14
public:15
void getData() {16
this->getDataFromDB();17
}18
19
protected:20
virtual void getDataFromDB() {}21
};22

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

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

37
int 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
4
Filename : SQLOracle_OO_Inheritance.cs
5
Compiler : Visual Studio 2005 / C# 2.0
6
Description : Demo how to solve problem by Object Inheritance
7
Release : 04/07/2007 1.0
8
*/
9
using System;
10
11
class DBManager {
12
public void getData() {
13
this.getDataFromDB();
14
}
15
16
protected virtual void getDataFromDB() {}
17
}
18
19
class SQLDBManager : DBManager {
20
protected override void getDataFromDB() {
21
Console.WriteLine("Get Data from SQL Server");
22
}
23
}
24
25
class OracleDBManager : DBManager {
26
protected override void getDataFromDB() {
27
Console.WriteLine("Get Data from Oracle");
28
}
29
}
30
31
class 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.com3

4
Filename : SQLOracle_OO_Inheritance.cs5
Compiler : Visual Studio 2005 / C# 2.06
Description : Demo how to solve problem by Object Inheritance7
Release : 04/07/2007 1.08
*/9
using System;10

11
class DBManager {12
public void getData() {13
this.getDataFromDB();14
}15
16
protected virtual void getDataFromDB() {}17
}18

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

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

31
class 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
4
Filename : SQLOracle_OO_Polymorphism.cpp
5
Compiler : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
6
Description : Demo how to solve problem by Object Polymorphism
7
Release : 04/07/2007 1.0
8
*/
9
#include <iostream>
10
11
using namespace std;
12
13
class IDBServer {
14
public:
15
virtual void getDataFromDB() = 0;
16
};
17
18
class DBManager {
19
private:
20
IDBServer* dBServer;
21
22
public:
23
DBManager() {}
24
DBManager(IDBServer& dBServer) : dBServer(&dBServer) {}
25
26
public:
27
void getData() {
28
this->dBServer->getDataFromDB();
29
}
30
};
31
32
class SQLServer : public IDBServer {
33
public:
34
void getDataFromDB() {
35
cout << "Get Data from SQL Server" << endl;
36
}
37
};
38
39
class Oracle : public IDBServer {
40
public:
41
void getDataFromDB() {
42
cout << "Get Data from Oracle" << endl;
43
}
44
};
45
46
int 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.com3

4
Filename : SQLOracle_OO_Polymorphism.cpp5
Compiler : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++6
Description : Demo how to solve problem by Object Polymorphism7
Release : 04/07/2007 1.08
*/9
#include <iostream>10

11
using namespace std;12

13
class IDBServer {14
public:15
virtual void getDataFromDB() = 0;16
};17

18
class DBManager {19
private:20
IDBServer* dBServer;21
22
public:23
DBManager() {}24
DBManager(IDBServer& dBServer) : dBServer(&dBServer) {}25
26
public:27
void getData() {28
this->dBServer->getDataFromDB();29
}30
};31

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

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

46
int 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
4
Filename : SQLOracle_OO_Polymorphism.cs
5
Compiler : Visual Studio 2005 / C# 2.0
6
Description : Demo how to solve problem by Object Polymorphism
7
Release : 04/07/2007 1.0
8
*/
9
using System;
10
11
interface IDBServer {
12
void getDataFromDB();
13
}
14
15
class 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
28
class SQLServer : IDBServer {
29
public void getDataFromDB() {
30
Console.WriteLine("Get Data from SQL Server");
31
}
32
}
33
34
class Oracle : IDBServer {
35
public void getDataFromDB() {
36
Console.WriteLine("Get Data from Oracle");
37
}
38
}
39
40
class 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.com3

4
Filename : SQLOracle_OO_Polymorphism.cs5
Compiler : Visual Studio 2005 / C# 2.06
Description : Demo how to solve problem by Object Polymorphism7
Release : 04/07/2007 1.08
*/9
using System;10

11
interface IDBServer {12
void getDataFromDB();13
}14

15
class 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

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

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

40
class 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
4
Filename : SQLOracle_GP_template.cpp
5
Compiler : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
6
Description : Demo how to solve problem by template
7
Release : 04/07/2007 1.0
8
*/
9
#include <iostream>
10
11
using namespace std;
12
13
template <typename T>
14
class DBManager {
15
private:
16
T* dBServer;
17
18
public:
19
void getData() {
20
this->dBServer->getDataFromDB();
21
}
22
};
23
24
class SQLServer {
25
public:
26
void getDataFromDB() {
27
cout << "Get Data from SQL Server" << endl;
28
}
29
};
30
31
class Oracle {
32
public:
33
void getDataFromDB() {
34
cout << "Get Data from Oracle" << endl;
35
}
36
};
37
38
int main() {
39
DBManager<SQLServer> theDBManager1;
40
theDBManager1.getData();
41
42
DBManager<Oracle> theDBManager2;
43
theDBManager2.getData();
44
}
/* 2
(C) OOMusou 2007 http://oomusou.cnblogs.com3

4
Filename : SQLOracle_GP_template.cpp5
Compiler : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++6
Description : Demo how to solve problem by template7
Release : 04/07/2007 1.08
*/9
#include <iostream>10

11
using namespace std;12

13
template <typename T>14
class DBManager {15
private:16
T* dBServer; 17
18
public:19
void getData() {20
this->dBServer->getDataFromDB();21
}22
};23

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

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

38
int 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
4
Filename : SQLOracle_GP_Generic.cs
5
Compiler : Visual Studio 2005 / C# 2.0
6
Description : Demo how to solve problem by Generic
7
Release : 04/07/2007 1.0
8
*/
9
using System;
10
interface IDBServer {
11
void getDataFromDB();
12
}
13
14
class 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
26
class SQLServer : IDBServer{
27
public void getDataFromDB() {
28
Console.WriteLine("Get Data from SQL Server");
29
}
30
}
31
32
class Oracle : IDBServer{
33
public void getDataFromDB() {
34
Console.WriteLine("Get Data from Oracle");
35
}
36
}
37
38
class 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.com3

4
Filename : SQLOracle_GP_Generic.cs5
Compiler : Visual Studio 2005 / C# 2.06
Description : Demo how to solve problem by Generic7
Release : 04/07/2007 1.08
*/9
using System;10
interface IDBServer {11
void getDataFromDB();12
}13

14
class 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

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

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

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


浙公网安备 33010602011771号