模板方法、策略方法

模板方法

定义:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重新定义该算法的某些特定步骤。它是一种类行为型模式。

优缺点

优点:

  1. 它封装了不可变部分,扩展可变部分。它把认为是不可变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展;
  2. 在父类中提取了公共的部分代码,便于代码复用
  3. 部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。

缺点:

  1. 对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也抽象;
  2. 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度

适用场景

  1. 算法的整体步骤很固定,但其中个别部分易变时,这时候可以适用模板方法模式,将容易变的部分抽象出来,供子类实现。
  2. 多个子类存在公共行为时,可以将其提取出来并集中到一个公共父类中以避免代码重复。
  3. 需要控制子类的扩展时,模板方法只在特定点调用钩子操作,这样就只允许在这些点进行扩展。

主要角色

  • 抽象类(AbstractClass):负责给出一个算法的轮廓和骨架,包含以下方法:
  1. 模板方法(写公有方法,已经定义好的公有模板,无需再子类中重写):定义了算法的骨架,按某种顺序调用其基本方法:
  2. 基本方法:是整个算法中的一个步骤,包含以下几种类型:
    (1). 抽象方法:在抽象类中申明,由具体子类实现。
    (2). 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。
    (3). 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法2种。
  • 具体子类(ConcreteClass):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。

结构图

在这里插入图片描述
举例:出国留学手续一般经过以下流程:索取学校资料、提出入学申请、办理因私出国护照、出境卡和公证,申请签证、体验、订机票、准备行装、抵达目标学校等;其中有些业务对各个学校是一样的,但有些业务因学校的不同而不同。使用模板方法模式来实现。结构图如下:
在这里插入图片描述

策略模式

定义:该模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。

优缺点

优点:

  1. 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句
  2. 策略模式提供了一系列的可供重用的算法簇,恰当使用继承可以把算法簇的公共代码转移到父类中,从而避免重复的代码
  3. 策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的策略;
  4. 策略模式提供了对“开闭原则”的完美支持,可以在不修改源代码的情况下,灵活增加新算法;
  5. 策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离

缺点:
1.客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类。
2. 策略模式造成很多策略类

策略模式的应用场景

  1. 一个系统需要动态地在几种算法中选择一种时,可将每个算法封装到策略类中。
  2. 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,可将每个条件分支移入到他们各自的策略类中以代替这些条件语句。
  3. 系统中各算法彼此完全独立,且要求客户隐藏具体算法的实现细节时。
  4. 系统要求使用算法的客户不应该知道其操作的数据时,可使用策略模式来隐藏与算法相关的数据结构。
  5. 多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择具体要执行的行为。

策略模式的主要角色:

  1. 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
  2. 具体策略(ConcreteStrategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
  3. 环境(Context)类:持有一个策略类的引用,最终给客户端调用。

结构图

在这里插入图片描述
例子:关于大闸蟹菜的做法有很多种,本例以清蒸大闸蟹和红烧大闸蟹2种方法为例,介绍策略模式的应用。结构图如下:
在这里插入图片描述

模式的扩展

在一个使用策略模式的系统中,当存在的策略很多时,客户端管理所有策略算法将变得很复杂,如果在环境类中 使用简单工厂模式来管理这些策略类将大大减少客户端的工作复杂程度,结构图如下:

在这里插入图片描述

注意:该文章内容采摘于《软件设计模式(Java版)》,作者:程细柱

接口可以用抽象类替代,反之不行;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值