模板方法模式

#模板方法模式-----封装算法
##一、定义模板方法模式

行为模式主要关注对象的响应性,它处理对象之间的交互以实现更强大的功能。模板方法模式是一种行为设计模式,通过一种称为模板方法的方式来定义程序框架或算法。模板方法模式还通过将这些步骤中的一些实现推迟到子类来帮助重新定义或定制算法的某些步骤。这意味着子类可以重新定义自己的行为。需要重点关注的是,步骤的改变并不影响原始算法的结构。因此,在模板方法模式中的子类可以通过覆盖来创建不同的行为或算法。
我们可以使用抽象类来定义算法的步骤。这些步骤在模板方法模式的上下文中也称为原始操作。这些步骤通常用抽象方法定义,而模板方法则用来定义算法。ConcreteClass(子类化抽象类)则用来实现算法中子类的特定步骤。
模板方法模式使用于以下场景:
(1)当多个算法或类实现类似的或相同逻辑的时候;
(2)在子类中实现算法有助于减少重复代码的时候;
(3)可以让子类利用覆盖实现行为来定义多个算法的时候。

##(二)、了解模板方法设计模式

模板方法模式的主要意图如下:
(1)使用基本操作定义算法的框架;
(2)重新定义子类的某些操作,而无需修改算法的结构;
(3)实现代码重用并避免重复工作;
(4)利用通用接口或实现。
模板方法模式使用以下术语-----AbstractClass、ConcreteClas、TemplateMethod和Client:
AbstractClass:声明一个定义算法步骤的接口。
ConcreteClas:定义子类特定的步骤。
TemplateMethod():通过调用步骤方法来定义算法。

假设想为IOS设备开发自己的交叉编译器并运行程序。我们首先开发一个抽象类(编译器),来定义编译器的算法。编译器执行的操作是收集由抽程序语言编写的源代码,然后编译成目标代码(二进制格式)。我们将这些步骤定义为collectSource()和compileToObject()抽象方法,同时还定义了负责执行程序的run()方法。该算法是由compileAndRun()方法来定义的,它通过内部调用collectSource()、compileToObject()和run()方法来定义编译器的算法。
然后,让具体类IOSCompiler实现抽象方法,在IOS设备上编译并运行Swift代码。

from abc import ABCMeta, abstractmethod

class Compiler(metaclass = ABCMeta):
	@abstractmethod
	def collectSource(self):
		pass
	@abstractmethod	
	def compileToObject(self):	
		pass
	@abstractmethod	
	def run(self):	
		pass
	##	
	def compileAndRun(self):	
		self.collectSource()
		self.compileToObject()
		self.run()
class IOSCompiler(Compiler):		
	def collectSource(self):
		print('Collecting Swift Source Code')
	def compileToObject(self):	
		print('Compiling Swift Code to LLVM bitcode')
	def run(self):	
		print('Program running on runtime environment')

if __name__ == '__main__':
	ios =IOSCompiler()
	ios.compileAndRun()	

##三、模板方法模式的UML图
这里写图片描述

通过观察UML图,会发现这个模式有4个主要参与者:

  • AbstractClass:在抽象方法的帮助下定义算法的操作或步骤。这些步骤将被具体子类覆盖。
  • template_method():定义算法的框架。在模板方法中调用抽象方法定义的多个步骤来定义序列或算法本身。
  • ConcreteClass:实现(由抽象方法定义的)步骤,来执行算法子类的特定步骤。

##四、现实世界中的模板方法模式
想象一个旅行社的例子,他们定义了各种旅游路线,并提供度假套装行程。一个行程套餐本质上是你作为客户允诺的一次旅行。旅行还涉及一些详细信息,如旅游的地点、交通方式和与旅行有关的其他因素。当然,同样的行程可以根据客户的需求进行不同的定制。
代码实现:

from abc import ABCMeta, abstractmethod

class Trip(metaclass = ABCMeta):
	@abstractmethod
	def setTransport(self):
		pass
	@abstractmethod	
	def day1(self):	
		pass
	@abstractmethod	
	def day2(self):	
		pass
	@abstractmethod	
	def day3(self):	
		pass	
	@abstractmethod	
	def returnHome(self):	
		pass	
	#实际定义该旅行的行程:	
	def itinerary(self):	
		self.setTransport()
		self.day1()
		self.day2()
		self.day3()
		self.returnHome()
#ConcreteClass:		
class VeniceTrip(Trip):		
	def setTransport(self):
		print('Take a boat...')
	def day1(self):	
		print('day1 visit to ...')
	def day2(self):	
		print('day2 visit to ...')
	def day3(self):
		print('day3 visit to ...')
	def returnHome(self):
		print('get back')
class MaldivesTrip(Trip):		
	def setTransport(self):
		print('On foot...')
	def day1(self):	
		print('day1 visit to ...')
	def day2(self):	
		print('day2 visit to ...')
	def day3(self):
		print('day3 visit to ...')
	def returnHome(self):
		print('get back')	
#Client:
class TraveAgency:
	def arrange_trip(self):		
		choice = input('what kind of place you\'ll like to go?(historical or beach)')
		if choice == 'historical':
			self.trip = VeniceTrip()
			self.trip.itinerary()
		if choice == 'beach':
			self.trip = MaldivesTrip()
			self.trip.itinerary()
			
if __name__ == '__main__':
	ta = TraveAgency()
	ta.arrange_trip()

##五、模板方法模式的优缺点
模板方法模式提供以下优点:

  • 没有代码重复;
  • 由于模板方法模式使用继承而不是合成,因此能够对代码进行重用。所以,只有为数不多的几个方法需要重写;
  • 灵活性允许子类决定如何实现算法中的步骤。

模板方法模式的缺点如下:

  • 调试和理解模板方法模式中的流程序列有时会令人困惑。你最终实现的方法可能是一个不应该实现的方法,或根本没有实现抽象方法。文档和严格的错误处理必须由程序员完成。
  • 模板框架的维护可能是一个问题,因为任何层次(低层或高层)的变更都可能对实现造成干扰。因此,使用模板方法模式可能会使维护变得异常痛苦。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值