策略模式--把大象塞进冰箱
2019-06-10 本文已影响1人
space0o0
大熊今天接到一个客户的要求,需要把一头大象塞进冰箱。
具体步骤大家都知道:
1·把冰箱门打开;
2·把大象放进去;
3·把冰箱门关上;
大熊就想到需要先实现三个具体步骤,而在实现具体步骤前,需要定义一个接口(interface),方法就是抽象的步骤
/**
* 步骤的接口
*/
interface Strategy {
/**
* 抽象的操作
* 把大象放进冰箱的123个操作步骤
*/
fun operate()
}
然后,三个步骤就可以实现interface,把每一步的具体操作完美实现。
class Operation1 : Strategy {
override fun operate() {
println("步骤1:打开冰箱门")
}
}
class Operation2 : Strategy {
override fun operate() {
println("步骤2:把大象塞进去")
}
}
class Operation3 : Strategy {
override fun operate() {
println("步骤3:把冰箱门关上")
}
}
三个步骤的具体实现已经存在了,可是客户不知道怎么用啊,所以大熊又制作了一本操作手册(UserManual)
手册就是帮助用户怎么把大象放进冰箱
/**
* 把大象关进冰箱的使用说明手册
*/
class UserManual(strategy: Strategy) {
private var iStrategy: Strategy? = null
init {
this.iStrategy = strategy
}
/**
* 查看使用说明
* 下一步
*/
fun watch() {
iStrategy?.operate()
}
}
拿到了说明书后,大熊只需要告诉客户看说明书的哪一个步骤,我们的说明书就把具体实现告诉给客户了。
fun main(args: Array<String>) {
//打开操作手册第一步
var userManualBook = UserManual(Operation1())
userManualBook.watch()
//打开操作手册第二步
userManualBook = UserManual(Operation2())
userManualBook.watch()
//打开操作手册第三步
userManualBook = UserManual(Operation3())
userManualBook.watch()
}
//logcat
步骤1:打开冰箱门
步骤2:把大象塞进去
步骤3:把冰箱门关上
策略模式的实现,就是完美诠释了java的高内聚,低耦合的思路。
如果我们需要增加第4个步骤,就可以实现interface,对客户只需告诉他操作的名字。我们完全不需要改动第1,第2,第3个步骤class。这也就是设计模式的意义所在。