(原創) 試試看你手上對付問題有幾種武器!! (C/C++) (.NET) (C#)
GoF Design Pattern p.22說,物件導向對付問題有三種方法:1.物件繼承,2.物件多型,3.物件泛型,若加上程序導向,我們手中最少有四種武器對付問題,你會哪幾種呢?
一個簡單的需求,我們要抓資料,但資料同時可能在SQL Server,也可能在Oracle,將來還有可能有其他Database Server,所以我們必須最少實做兩種方式。
執行結果


第一種,程序導向(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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

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