概念解析
模板模式,指的是定义一个操作中的算法框架,而将算法中用到的某些具体步骤放到子类中实现,使得子类在不改变算法结构的情况下重新定义该算法的某些特定步骤。其实模板模式本质上只是利用了对象的继承机制。 基本适用场景:公共方法提取复用,避免代码重复;或者希望通过子类来决定父类算法中的某个步骤是否执行,实现子类对父类的反向控制。
设计模板
模板模式的框架模型如下:
1
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
from abc import ABCMeta, abstractmethod
class Template(metaclass=ABCMeta):
"""模板类(抽象类)"""
@asbstractmethod
def step_one(self):
pass
@asbstractmethod
def step_two(self):
pass
@asbstractmethod
def step_three(self):
pass
def template_method(self):
"""模板方法"""
self.step_one()
self.step_two()
self.step_three()
class TemplateImplA(Template):
"""模板实现类A"""
def step_one(self):
print("步骤一")
def step_two(self):
print("步骤二")
def step_three(self):
print("步骤三")
class TemplateImplB(Template):
"""模板实现类B"""
def step_one(self):
print("Step one")
def step_two(self):
print("Step two")
def step_three(self):
print("Step three")
实例分析
场景分析:模拟阅读书的翻页操作,可以选择不同的翻页方式,有不同的展示效果:
1
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
53
54
55
from abc import ABCMeta, abstractmethod
class ReaderView(metaclass=ABCMeta):
"""阅读器视图"""
def __init__(self):
self.__cur_pagenum = 1
def get_page(self, pagenum):
self.__cur_pagenum = pagenum
return "第" + str(pagenum) + "页的内容"
def pre_page(self):
"""模板方法,往前翻一页"""
content = self.get_page(self.__cur_pagenum - 1)
self._display_page(content)
def next_page(self):
"""模板方法,往前翻一页"""
content = self.get_page(self.__cur_pagenum + 1)
self._display_page(content)
@abstractmethod
def _display_page(self, content):
"""翻页效果"""
pass
class SmoothView(ReaderView):
"""左右平滑的视图"""
def _display_page(self, content):
print("左右平滑:" + content)
class SimulationView(ReaderView):
"""仿真翻页的视图"""
def _display_page(self, content):
print("仿真翻页:" + content)
def test_reader():
smoothview = SmoothView()
smoothview.next_page()
smoothview.pre_page()
simulationview = SimulationView()
simulationview.next_page()
simulationview.pre_page()
"""
测试结果:
左右平滑:第2页的内容
左右平滑:第1页的内容
仿真平滑:第2页的内容
仿真平滑:第1页的内容
"""