策略模式用于算法的自由切换和扩展,分离算法的定义与实现。java
Android中策略模式的应用有WebView设计,Animation中的Interpolator设计.....算法
例如电商应用中的商品价格计算bash
fun main(args: Array<String>) { val price = 4500.0 val mContext = PriceStrategyContext(NormalPriceStrategy()) mContext.strategyMethod(price) mContext.setStrategy(GoldPriceStrategy()) mContext.strategyMethod(price) } interface PriceStrategy { /** * 计价方法 */ fun calculate(price: Double): Double } class NormalPriceStrategy : PriceStrategy { override fun calculate(price: Double): Double { println("普通用户的计价策略方法被访问") return price } } class GoldPriceStrategy : PriceStrategy { override fun calculate(price: Double): Double { println("黄金会员的计价策略方法被访问") return 0.95 * price } } class DiamondPriceStrategy : PriceStrategy { override fun calculate(price: Double): Double { println("钻石会员的计价策略方法被访问") return 0.9 * price } } /** * 上下文环境,定义了 PriceStrategy 接口引用,在建立 PriceStrategyContext 实例时传入具体的策略类, * 具体策略类调用策略方法。客户端建立 PriceStrategyContext 对象负责调用策略方法。 */ class PriceStrategyContext() { private var mPriceStrategy: PriceStrategy? = null constructor(mPriceStrategy: PriceStrategy) : this() { this.mPriceStrategy = mPriceStrategy } fun setStrategy(strategy: PriceStrategy?): PriceStrategyContext { mPriceStrategy = strategy!! return this } //持有算法方法 fun strategyMethod(price: Double) { mPriceStrategy!!.calculate(price) } } 复制代码
策略模式中的上下文环境 PriceStrategyContext 的职责是隔离客户端与策略类的耦合,无须关注具体的策略行为。上面示例中, PriceStrategyContext 的做用只是负责调度策略类的执行并获取结果,并无彻底起到隔离客户端与策略类的做用。markdown
经过简单工厂模式将具体策略对象的建立与调用方进行隔离,也可经过策略枚举或者策略类的配置注入,将PriceStrategyContext中的具体策略类融合在一块儿,简化代码。ide
##简单工厂函数
abstract class PriceStrategyFactory { companion object { inline operator fun <reified T : PriceStrategy> invoke(): PriceStrategy? { var strategy: PriceStrategy? = null try { strategy = T::class.java.newInstance() as PriceStrategy } catch (e: Exception) { e.printStackTrace() } return strategy } } } 复制代码
##枚举this
fun main(args: Array<String>) { PriceStrategy.GOLD.calculate(4500.0) } enum class PriceStrategy(var type: String) { // NORMAL("normal") { override fun calculate(price: Double): Double { println("普通用户的计价策略方法被访问") return price } }, GOLD("gold") { override fun calculate(price: Double): Double { println("黄金会员的计价策略方法被访问") return price * 0.95 } }, DIAMOND("diamond") { override fun calculate(price: Double): Double { println("钻石会员的计价策略方法被访问") return price * 0.9 } }; fun setType(type: String): PriceStrategy { this.type = type return this } abstract fun calculate(price: Double): Double } 复制代码
##高阶函数抽象算法 策略类仅仅是针对算法行为的一种抽象,Kotlin 中能够使用高阶函数替代。spa
fun main(args: Array<String>) {
PriceStrategyContext(4500.0, NormalPriceStrategy).calculate()
}
// 策略用val声明成lambda表达式
val NormalPriceStrategy = { price: Double -> price }
val GoldPriceStrategy = { price: Double -> price * 0.95 }
val DiamondPriceStrategy = { price: Double -> price * 0.9 }
class PriceStrategyContext(private val price: Double, private val priceStrategy: (Double) -> Double) {
//
fun calculate() = priceStrategy(price)
}
复制代码
策略模式须要不停的在各个算法间切换,形成不少逻辑判断,咱们能够配合使用一些其余的模式去消除。设计