close
新增一個抽象類別(範本方法),裡面定義驗算法的骨架TemplateMethod(),包含3個步驟proc1()、proc2()、proc3();這些步驟實作延遲至繼承的子類別去實作,增加了使用上的彈性。
1: abstract class AbstractClass
2: {
3: protected abstract void proc1();
4: protected abstract void proc2();
5: protected abstract void proc3();
6: public void TemplateMethod()
7: {
8: proc1();
9: proc2();
10: proc3();
11: MessageBox.Show("TemplateMethod");
12: }
13: }
ConcreteClassA和ConcreteClassB分別繼承AbstractClass,因此需要覆寫(override)剛剛父類別的抽象方法:包含3個步驟proc1()、proc2()、proc3();
ConcreteClassA: 1. 讀入影像 2.彩色轉灰階 3. 灰階轉黑白
1: class ConcreteClassA : AbstractClass
2: {
3: protected override void proc1()
4: {
5: MessageBox.Show("具體A proc1=imread");
6: //throw new NotImplementedException();
7: }
8: protected override void proc2()
9: {
10: MessageBox.Show("具體A proc2=rgb2gray");
11: //throw new NotImplementedException();
12: }
13: protected override void proc3()
14: {
15: MessageBox.Show("具體A proc3=gray2bw");
16: //throw new NotImplementedException();
17: }
18: }
ConcreteClassB: 1.讀入影像 2.金字塔縮小 3.金字塔放大
1: class ConcreteClassB : AbstractClass
2: {
3: protected override void proc1()
4: {
5: MessageBox.Show("具體B proc1=imread");
6: //throw new NotImplementedException();
7: }
8: protected override void proc2()
10: MessageBox.Show("具體B proc2=pyrmidDown");
11: //throw new NotImplementedExcepti
9: {
on();
12: }
13: protected override void proc3()
14: {
15: MessageBox.Show("具體B proc3=pyrmidUp");
16: //throw new NotImplementedException();
17: }
18: }
客戶端程式
AbstractClass imgProc;
影像處理1. 讀入影像 2.彩色轉灰階 3. 灰階轉黑白
imgProc = new ConcreteClassA(); <---------多型
或是
影像處理1.讀入影像 2.金字塔縮小 3.金字塔放大
imgProc = new ConcreteClassB();
1: AbstractClass imgProc;
2: private void button1_Click(object sender, EventArgs e)
3: {
4: imgProc = new ConcreteClassA();
5: imgProc.TemplateMethod();
6: }
7:
8: private void button2_Click(object sender, EventArgs e)
9: {
10: imgProc = new ConcreteClassB();
11: imgProc.TemplateMethod();
12: }
------------------------------------
如果把父類別中proc1()、proc2()、proc3()從abstract變成virtual,則繼承的子類別可以不需要實作(覆寫)全部函式,儘管TemplateMethod中有定義proc3()
1: namespace TemplateCMethodDemo
2: {
3: abstract class AbstractClass
4: {
5: protected virtual void proc1(){}
6: protected virtual void proc2(){}
7: protected virtual void proc3(){}
8: public void TemplateMethod()
9: {
10: proc1();
11: proc2();
12: proc3();
13: MessageBox.Show("TemplateMethod");
14: }
15: }
16: class ConcreteClassA : AbstractClass
17: {
18: protected override void proc1()
19: {
20: MessageBox.Show("具體A proc1=imread");
21: //throw new NotImplementedException();
22: }
23: protected override void proc2()
24: {
25: MessageBox.Show("具體A proc2=rgb2gray");
26: //throw new NotImplementedException();
27: }
28: //protected override void proc3()
29: //{
30: // MessageBox.Show("具體A proc3=gray2bw");
31: // //throw new NotImplementedException();
32: //}
33: }
34: class ConcreteClassB : AbstractClass
35: {
36: protected override void proc1()
37: {
38: MessageBox.Show("具體B proc1=imread");
39: //throw new NotImplementedException();
40: }
41: protected override void proc2()
42: {
43: MessageBox.Show("具體B proc2=pyrmidDown");
44: //throw new NotImplementedException();
45: }
46: protected override void proc3()
47: {
48: MessageBox.Show("具體B proc3=pyrmidUp");
49: //throw new NotImplementedException();
50: }
51: }
52: }
參考資料:
1. 大話設計模式, 作者: 程杰
全站熱搜
留言列表