设计模式思考之 Template Method 模式

151 阅读2分钟

这是我参与8月更文挑战的第21天,活动详情查看:8月更文挑战

Template Method翻译过来就是模版方法模式,简称模版模式。按照字面理解一下就是,按照既定的模版方法去运行。首先在深入了解之前,得问一下为什么?用了比不用好在哪呢?

首先模版模式中会存在两个角色,一个是抽象类,一个是具体类。

  • 抽象类:负责定义行为方法,可以是无实现的抽象方法,也可以是已经实现的方法
  • 具体类:继承抽象类,实现抽象方法

抽象类用户定义一个具体的行为系列,比如订单相关方法:创建,支付,发货,签收,退款等等。很多情况下,一个大的业务系统中很多地方可能都需要用到订单相关的一个或多个方法。如果没有模版方法,可能每个业务都要自己重写一遍相关的方法,然后如果这其中遇到了某个bug,所有的业务可能都需要修改。模版方法就是为了解决此类问题:

  • 一处实现,多处使用
  • 统一修复bug或者新增特性,所有子类均可使用

这就是效率的提升,听起来还是有点用处的。举个简单的例子:打印字符的能力。有些地方我只要打印出来就好了,有些地方我可能需要点格式。如下图所示:

图片.png

CharDisplay和StringDisplay分别继承了AbstractDisplay,作为抽象类,其规定了打开、关闭、打印和现实的几个方法。display方法是固定的,open、print、close则是抽象的,给子类自行实现。这样在print的样式上子类有充分的自由度,而display方法则代表在既定的业务框架下的固定显示规则。

另外,模式方法也满足了里氏替换原则,因为都是继承一个父类,在实例化时无论是哪个子类都可以正常工作。我们熟知的InputStream就是采用这样的设计模式,在父类中定义和实现了流操作的多个方法,交给多个不同场景的子类继承。我们创建流的时候都可以用InputStream来创建。

图片.png