怎么制作网站导航页,推广手段,网站制作学校找哪家,杭州商城网站开发策略模式#xff1a;一种行为型模式#xff0c;这些设计模式特别关注对象之间的通信。在策略模式中#xff0c;我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
介绍
意图#xff1a;定义一系列的算…策略模式一种行为型模式这些设计模式特别关注对象之间的通信。在策略模式中我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
介绍
意图定义一系列的算法、策略或行为,把它们封装成一个一个的策略类主要解决问题在有多种相似算法、策略或行为的情况下使用 if...else 所带来的复杂和难以维护。关键代码实现同一个接口优点1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。缺点1、策略类会增多。 2、所有策略类都需要对外暴露这有点违背设计模式六大原则的迪米特法则。
举个例子绘制三角形、圆形、矩形图案Android Kotlin 自定义View
步骤1创建一个接口
interface Strategy {fun runCanvas(canvas: Canvas?)
}
步骤2创建实现接口的实体类。
class Triangle:Strategy {override fun runCanvas(canvas: Canvas?) {// 绘制一个三角形行为// ......}
}
class Circular:Strategy {override fun runCanvas(canvas: Canvas?) {// 绘制一个圆形行为// ......}
}
class Rectangle:Strategy {override fun runCanvas(canvas: Canvas?) {// 绘制一个矩形形行为// ......}
}
步骤3创建上下文类。
//创建 Context 类。
//class Context(private val strategy: Strategy) {
//
// fun executeStrategy(canvas: Canvas?){
// return strategy.runCanvas(canvas)
// }
//}class CustomView(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : View(context, attrs, defStyleAttr, defStyleRes) {constructor(context: Context) : this(context, null, 0)constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : this(context, attrs, defStyleAttr,0)private var strategy: Strategy? nullfun setStrategy(strategy: Strategy?) {this.strategy strategy}override fun onDraw(canvas: Canvas?) {strategy?.runCanvas(canvas)super.onDraw(canvas)}}
步骤使用
// 使用 Context 来查看当它改变策略 Strategy 时的行为变化。
// var context Context(Triangle())
// context.executeStrategy(canvas)
// var context Context(Circular())
// context.executeStrategy(canvas)
// var context Context(Rectangle())
// context.executeStrategy(canvas)// 改变策略 StrategycustomView.setStrategy(Triangle())customView.invalidate()//触发执行draw方法customView.setStrategy(Circular())customView.invalidate()customView.setStrategy(Rectangle())customView.invalidate()