持续创作,加速成长!这是我参与「日新计划 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 的办法了。

结语

战略形式适合应用场景

  • 当你想运用对象中各种不同的算法变体,并期望能在运行时切换算法时,可运用战略形式。
  • 当你有许多仅在执行某些行为时略有不同的类似类时,可运用战略形式。
  • 假如算法在上下文的逻辑中不是特别重要,运用该形式能将类的业务逻辑与其算法完成细节阻隔开来。

战略形式优缺陷

优点

  • 能够在运行时切换对象内的算法。
  • 能够将算法的完成和运用算法的代码阻隔开来。
  • 能够运用组合来代替继承。
  • 开闭原则。你无需对上下文进行修改就能够引入新的战略。

缺陷

  • 假如你的算法极少发生改动,这个形式并不适用
  • 客户端必须知晓战略间的不同——它需要挑选适宜的战略。

扩展阅览 下面还有其他形式

创立型-工厂形式

创立型-制作者形式

结构型-适配器形式

结构型-桥接形式

结构型-组合形式

结构型-装修器形式

结构型-外观形式