- 定义:
策略模式定义了算法族 ,分别封装起来,让它们之间可以相互替换。此模式让算法的变化独立于使用算法的客户。 - 概述
此模式又称政策模式(Policy pattern),有三个比较重要的类
抽象策略类(FlyBehavior/QuackBehavior)
抽象策略类可以有一个,也可以有多个,其声明了算法的方法,需要不同的具体算法实现它,它可以是抽象类也可以是接口
具体策略类(FlyNoWay/FlyWithWing…)
实现抽象策略类中定义的方法
使用环境类(Duck,本例被声明为抽象)
持有抽象策略类的引用,并可以设置具体策略类,当然你也可以不这么做。 - 实例(Kotlin语言)
下面是两个抽象策略类
interface FlyBehavior {
fun fly()
}
interface QuackBehavior {
fun quack()
}
下面是抽象策略类的具体实现
class FlyNoWay:FlyBehavior {
override fun fly() {
println("duck can not fly which is no wings")
}
}
class FlyWithWing:FlyBehavior {
override fun fly() {
println("I'm flying...")
}
}
class Quack:QuackBehavior {
override fun quack() {
println("quack")
}
}
class MuteQuack:QuackBehavior {
override fun quack() {
println("can't quack...")
}
}
下面是使用环境类以及其实现类
abstract class Duck {
abstract var flyBehavior: FlyBehavior
abstract var quackBehavior: QuackBehavior
fun swim(): Unit {
println("All duck can swim")
}
abstract fun display()
fun fly(): Unit {
flyBehavior.fly()
}
fun quack(): Unit {
quackBehavior.quack()
}
fun setFly(fly: FlyBehavior): Unit {
flyBehavior = fly
}
fun setQuack(quack: QuackBehavior): Unit {
quackBehavior = quack
}
}
//实现类
class MallardDuck(override var flyBehavior: FlyBehavior, override var quackBehavior: QuackBehavior) : Duck() {
override fun display() {
println("I'm a mallard duck")
}
}
下面是测试类及测试结果
fun main(args: Array<String>) {
val mallard: Duck = MallardDuck(FlyWithWing(), Quack())
mallard.swim()
mallard.quack()
mallard.fly()
mallard.setQuack(MuteQuack())
mallard.quack()
}
//结果
All duck can swim
quack
I'm flying...
can't quack...
Process finished with exit code 0
以下是类图
如有错误,请留言更正,或进580725421群讨论,以免误导其他开发者!!!