@[toc]
策略者设计模式
主要来源Head First设计模式(书)
书中定义:策略者设计模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变换独立于使用算法的用户。
我的理解:我们的旅行方式:飞机、汽车、火车等都是一个策略。
设计模式入门
oo技术:面向对象技术
软件开发的真理:change
第一个设计原则
找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混合在一起。也就是,把会变化的部分提取出来并'封装'起来,好让其他部分不受到影响
第二个设计原则
针对接口编程,而不是针对实现编程
“针对接口编程”真正意思是“针对超类型编程”,关键是“多态”
第三个原则
多组合,少继承
案例分析
首先定义策略的最上层
/**
* 类描述:策略接口<br/>
* 创建人:吴冬冬<br/>
* 创建时间:2018/8/14 14:59 <br/>
*/
interface 策略接口 {
fun 算法();
}
然后定义自己需要的策略(具体策略方式:也就是具体算法内容)
class 具体策略1 : 策略接口{
override fun 算法() {
Log.d("123===", "我是具体策略1")
}
}
class 具体策略2 : 策略接口{
override fun 算法() {
Log.d("123===", "我是具体策略2")
}
}
class 具体策略3 : 策略接口{
override fun 算法() {
Log.d("123===", "我是具体策略3")
}
}
最后就是谁怎么调用这些策略
又想到调用者可能不同,也有可能需要改变其策略,所以分了超类型和子类型来定义
定义超类型
abstract class 超类型{
protected lateinit var m策略: 策略接口
fun set策略(新策略: 策略接口){
m策略 = 新策略
}
}
定义子类型
class 子类1 : 超类型(){
init {
m策略 = 具体策略1()
}
fun get策略(){
m策略.算法()
}
}
class 子类2 : 超类型(){
init {
m策略 = 具体策略2()
}
fun get策略(){
m策略.算法()
}
}
class 子类3 : 超类型(){
init {
m策略 = 具体策略3()
}
fun get策略(){
m策略.算法()
}
}
调用
//策略
val mZi1 = 子类1()
val mZi2 = 子类2()
val mZi3 = 子类3()
mZi1.get策略()
mZi2.get策略()
mZi3.get策略()
//重新为子类1定义策略
mZi1.set策略(具体策略3())
mZi1.get策略()
结果
我是具体策略1
我是具体策略2
我是具体策略3
我是具体策略3
网友评论