您的位置:首页 > 其它

对象行为型模式——策略模式(Strategy Pattern)

2017-10-18 17:09 183 查看
定义:

策略模式定义了算法族 ,分别封装起来,让它们之间可以相互替换。此模式让算法的变化独立于使用算法的客户。

概述

此模式又称政策模式(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群讨论,以免误导其他开发者!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: