一个不错的视频教程: https://www.bilibili.com/video/av41443026/?p=1
- 解释: 定义一系列的逻辑方法,将它们封装起来(封装成一个个类),使得我们在调用它们的逻辑方法时,它们可以相互替换,利用了多态的特性(怎么相互替换: 给它们一个统一的接口或者抽象类)
- 个人理解:一个人(Context)遇到一个问题(Problem)想出多种策略(Strategy)来解决此问题
例如: 一天小王突然有个需求,让我们到达北京它就打印出“北京欢迎你”,到达山东它就打印出“山东欢迎你”
首先,我们要把问题抽象出来,此需求归根到底就是打印log,所以我们写一个打印log的接口
interface MyLog { // 代表问题
fun myLog():String // 代表问题的解决方式
}
其次,有了问题就得解决,新建BeiJing类与ShanDong类,他们都是解决问题的策略,所以他们都实现了代表问题的MyLog接口,实现了接口中的解决问题的办法(各有各的解决办法)
class BeiJing : MyLog{
override fun myLog():String{
//完成逻辑操作
return "北京欢迎你"
}
}
class ShanDong : MyLog{
override fun myLog():String{
//完成逻辑操作
return "山东欢迎你"
}
}
最后: 解决问题的主体(Context)通过构造方法获取到不同的解决问题的策略(实现了MyLog接口的类)来解决不同的问题;(看注释)
class Context(val log:MyLog){ //构造方法接受一个MyLog接口类型的对象
fun getLog(): String {
/**
###########下面方法就利用了多态的特性############
通过构造方法中传入的MyLog接口类型的类对象,来调用相应的方法,
你传的是ShanDong类它就执行ShanDoing类 中的myLog方法,
传的是BeiJing类就执行BeiJing类中的myLog方法
*/
var mLogText:String = log.myLog()
return mLogText
}
}
//使用
var context1 = Context(ShanDong()) // 在山东使用山东的策略
print(context1.getLog()) // 输入结果“山东欢迎你”
var context2 = Context(BeiJing()) // 在北京使用北京的策略
print(context2.getLog()) // 输入结果“北京欢迎你”