对象行为型模式——策略模式(Strategy Pattern)
2017-10-18 17:09
183 查看
定义:
策略模式定义了算法族 ,分别封装起来,让它们之间可以相互替换。此模式让算法的变化独立于使用算法的客户。
概述
此模式又称政策模式(Policy pattern),有三个比较重要的类
抽象策略类(FlyBehavior/QuackBehavior)
抽象策略类可以有一个,也可以有多个,其声明了算法的方法,需要不同的具体算法实现它,它可以是抽象类也可以是接口
具体策略类(FlyNoWay/FlyWithWing…)
实现抽象策略类中定义的方法
使用环境类(Duck,本例被声明为抽象)
持有抽象策略类的引用,并可以设置具体策略类,当然你也可以不这么做。
实例(Kotlin语言)
下面是两个抽象策略类
下面是抽象策略类的具体实现
下面是使用环境类以及其实现类
下面是测试类及测试结果
以下是类图
如有错误,请留言更正,或进580725421群讨论,以免误导其他开发者!!!
策略模式定义了算法族 ,分别封装起来,让它们之间可以相互替换。此模式让算法的变化独立于使用算法的客户。
概述
此模式又称政策模式(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群讨论,以免误导其他开发者!!!
相关文章推荐
- 设计模式-策略模式---Strategy(对象行为型)
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 策略模式(Strategy Pattern,对象行为型模式)
- 策略模式——对象行为型模式
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 策略模式Strategy(对象行为型)
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 设计模式-策略模式(对象行为型)
- 设计模式之策略模式(一对象行为型)
- [导入]C#面向对象设计模式纵横谈(23):(行为型模式) Strategy 策略模式.zip(8.00 MB)
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- Java设计模式--策略模式(对象行为型)
- C#面向对象模式设计第二十三讲:Startegy 策略模式(行为型模式)
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 设计模式-策略模式---Strategy(对象行为型)