在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
意图
:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要解决
:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
何时使用
:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决
:将这些算法封装成一个一个的类,任意地替换。
关键代码
:实现同一个接口
示例:
//步骤 1
//创建一个接口。
interface Strategy {
fun doOperation(num1: Int, num2: Int): Int
}
//步骤 2
//创建实现接口的实体类。
class OperationAdd : Strategy {
override fun doOperation(num1: Int, num2: Int): Int {
return num1 + num2
}
}
class OperationSubtract : Strategy {
override fun doOperation(num1: Int, num2: Int): Int {
return num1 - num2
}
}
//步骤 3
//创建 Context 类。
class Context(val strategy: Strategy) {
fun executeStrategy(num1: Int, num2: Int): Int {
return strategy.doOperation(num1, num2)
}
}
//步骤 4
//使用 Context 来查看当它改变策略 Strategy 时的行为变化。
fun main(args: Array<String>) {
var context = Context(OperationAdd())
println("10 + 5 = " + context.executeStrategy(10, 5))
context = Context(OperationSubtract())
println("10 - 5 = " + context.executeStrategy(10, 5))
}
//打印结果:
//10 + 5 = 15
//10 - 5 = 5