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