策略设计模式
策略设计模式做的事情就是,将不同的行为策略进行独立封装,与类在逻辑上解耦。根据不同的上下文,切换选择不同的策略,然后用类对象进行调用。
有如下例子,一个游泳运动员会蛙泳、仰泳、自由泳多种游泳姿势,我们可以将游泳这个行为封装成接口,根据不同的场景我们可以调用不同的游泳姿势,如下代码所示:
package com.agg.kotlinapplication
interface SwimStrategy {
fun swim()
}
class Breaststroke : SwimStrategy {
override fun swim() {
println("Breaststroke")
}
}
class Backstroke : SwimStrategy {
override fun swim() {
println("Backstroke")
}
}
class Freestyle : SwimStrategy {
override fun swim() {
println("Freestyle")
}
}
class Swimmer(val strategy: SwimStrategy) {
fun swim() {
strategy.swim()
}
}
fun main(args: Array<String>) {
Swimmer(Freestyle()).swim() // Freestyle
Swimmer(Backstroke()).swim() // Backstroke
}
使用策略设计模式,实现了解耦和复用的目的,且很好的实现了在不同场景下切换采用不同的策略。不过可以使用Kotlin语言的高阶函数来简化策略模式,如下代码所示:
package com.agg.kotlinapplication
fun breaststroke() {
println("breaststroke")
}
fun backstroke() {
println("backstroke")
}
fun freestyle() {
println("freestyle")
}
class Swimmer(val swimming: () -> Unit) {
fun swim() {
swimming()
}
}
fun main(args: Array<String>) {
Swimmer(::freestyle).swim() // freestyle
Swimmer(::backstroke).swim() // backstroke
}
模版方法设计模式
模版方法设计模式,定义一个算法中的操作框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构,即可重定义该算法的某些特定步骤。
如果说策略设计模式采用的思路是将算法进行委托,那么传统的模版方法设计模式更多是基于继承的方式实现的——完全相同的步骤会在抽象类中实现,可个性化的某些步骤则在其子类中进行定义。如下例子,去银行办事比如说有三个步骤:排队取号等待;办理个性化业务;对服务进行评价。可采用如下代码实现模板方法设计模式:
package com.agg.kotlinapplication
abstract class BankTask {
fun execute() {
this.lineUp()
this.askForHelp()
this.evaluate()
}
private fun lineUp() {
println("line up to take a number")
}
private fun evaluate() {
println("evaluate service attitude")
}
abstract fun askForHelp()
}
class DrawMoneyTask : BankTask() {
override fun askForHelp() {
println("draw money out of an account")
}
}
class SaveMoneyTask : BankTask() {
override fun askForHelp() {
println("save money in a bank")
}
}
fun main(args: Array<String>) {
DrawMoneyTask().execute()
SaveMoneyTask().execute()
}
使用高阶函数改编后的模版方法设计模式如下:
package com.agg.kotlinapplication
class BankTask {
fun execute(askForHelp: () -> Unit) {
this.lineUp()
askForHelp()
this.evaluate()
}
private fun lineUp() {
println("line up to take a number")
}
private fun evaluate() {
println("evaluate service attitude")
}
}
fun DrawMoneyTask() {
println("draw money out of an account")
}
fun SaveMoneyTask() {
println("save money in a bank")
}
fun main(args: Array<String>) {
BankTask().execute(::DrawMoneyTask)
BankTask().execute(::SaveMoneyTask)
}
参考:【Kotlin核心编程-水滴技术团队】