持续创作,加速成长!这是我参与「日新计划 6 月更文应战」的第30天,点击查看活动详情
前语
在面向对象的开发过程中,其实我们或多或少的都接触过一些设计形式,可能知道或不知道其对应的名称,也不知道其详细运用场景,今日我们就来说说几种常见的设计形式,帮助你们在开发过程中,更加称心如意。
正文
战略形式
战略形式,便是界说一系列功用,把它们一个个封装起来, 并且使它们可相互交换,然后不影响全体。
很多时候,在我们开发的过程中就会遇到这种状况,比如,开发A功用完结后,又要开发一个B功用,能让用户在A和B功用直接切换,过段时刻后,又要开发C功用,同样能够切换A、B和C。要完结这项作业,就需要很多种if…else判断,战略形式就能够优化。
现实中的比如便是,你想去机场,当你去搜索去机场的道路时,导航就会有多种办法让你挑选,开车、公共交通、打车。时刻和花费都不相同。这便是给你挑选的战略,当你挑选花费最少时,系统就会帮你决定用那种办法出行。
下面,我们再来看代码的比如,完成一个核算功用。
首要界说一个战略协议(Strategy
),里面界说一个操作函数(operation
)返回Int
类型
protocol Strategy {
func operation(a: Int, b: Int) -> Int
}
界说三个操作办法分别是加(OperationAdd
)、减(OperationSubstract
)、乘(OperationMultiply
),然后完成对应的操作函数(operation
)
class OperationAdd: Strategy {
func operation(a: Int, b: Int) -> Int {
a + b
}
}
class OperationSubstract: Strategy {
func operation(a: Int, b: Int) -> Int {
a - b
}
}
class OperationMultiply: Strategy {
func operation(a: Int, b: Int) -> Int {
a * b
}
}
然后界说一个中心者,用于实例化后,进行对应操作。
class Context {
private var strategy: Strategy
init(strategy: Strategy) {
self.strategy = strategy
}
func executeStrategy(a: Int, b:Int) {
strategy.operation(a: a, b: b)
}
}
接下来,我们来看完成
var context = Context(strategy: OperationAdd())
print("10 + 5 = (context.executeStrategy(a: 10, b: 5))")
context = Context(strategy: OperationSubstract())
print("10 - 5 = (context.executeStrategy(a: 10, b: 5))")
context = Context(strategy: OperationMultiply())
print("10 * 5 = (context.executeStrategy(a: 10, b: 5))")
输出:
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
能够看出,只需有新的战略,只用继承Strategy
,然后完成operation
办法,就能够正常运用了,不必再去做一系列if…else 的办法了。
结语
战略形式适合应用场景
- 当你想运用对象中各种不同的算法变体,并期望能在运行时切换算法时,可运用战略形式。
- 当你有许多仅在执行某些行为时略有不同的类似类时,可运用战略形式。
- 假如算法在上下文的逻辑中不是特别重要,运用该形式能将类的业务逻辑与其算法完成细节阻隔开来。
战略形式优缺陷
优点
- 能够在运行时切换对象内的算法。
- 能够将算法的完成和运用算法的代码阻隔开来。
- 能够运用组合来代替继承。
- 开闭原则。你无需对上下文进行修改就能够引入新的战略。
缺陷
- 假如你的算法极少发生改动,这个形式并不适用
- 客户端必须知晓战略间的不同——它需要挑选适宜的战略。
扩展阅览 下面还有其他形式
创立型-工厂形式
创立型-制作者形式
结构型-适配器形式
结构型-桥接形式
结构型-组合形式
结构型-装修器形式
结构型-外观形式