美文网首页工作生活
设计模式(二) Strategy

设计模式(二) Strategy

作者: jianshudxw | 来源:发表于2019-07-01 13:38 被阅读0次

前言

定义:

定义一系列的算法,并且将每个算法封装起来,算法之间还可以互相替换。本模式使得算法可以独立于使用它的客户而变化。

  • 不用修改源码或继承的方式扩展原类的方法。
  • 行为型的设计模式。
  • 自我认识,在实现上是visitor模式的一部分
    案例
class Sequence {
    private var numbers: [Int];
    init(_ numbers: Int ...) {
        self.numbers = numbers;
    }
    func addNumber(value: Int) {
        self.numbers.append(value)
    }
    func coumpute() -> Int {
        return numbers.reduce(0){ $0 + $1};
    }
}

let sequence = Sequence(1, 2, 3, 4);
sequence.addNumber(value: 10);
sequence.addNumber(value: 20);
print("sum: \(sequence.coumpute())");

需求新增 乘法等算法。
也许你会这样做:

enum ALGORITHM {
    case ADD;
    case MULTIPLY;
}
class Sequence {
    private var numbers: [Int];
    init(_ numbers: Int ...) {
        self.numbers = numbers;
    }
    func addNumber(value: Int) {
        self.numbers.append(value)
    }
    func coumpute() -> Int {
        return numbers.reduce(0){ $0 + $1};
    }
    func compute(algorithm: ALGORITHM) -> Int {
        switch algorithm {
        case .ADD:
            return numbers.reduce(0){ $0 + $1 };
        case .MULTIPLY:
            return numbers.reduce(1){ $0 * $1 };
        }
    }
}

缺点:

  • 每次增加都会修改 Sequence

策略模式 实现

protocol Strategy {
    func execute(values:[Int]) -> Int;
}

class SumStrategy: Strategy {
    func execute(values: [Int]) -> Int {
        return values.reduce(0){ $0 + $1 };
    }
}

class MutiplayStrategy: Strategy {
    func execute(values: [Int]) -> Int {
        return values.reduce(1){ $0 * $1 }
    }
}

final class Sequence {
    private var numbers: [Int];
    init(_ numbers: Int ...) {
        self.numbers = numbers;
    }
    func addNumber(value: Int) {
        self.numbers.append(value)
    }
    func coumpute() -> Int {
        return numbers.reduce(0){ $0 + $1};
    }
    func compute(strategy: Strategy) -> Int {
        return strategy.execute(values: self.numbers);
    }
}

let sequence = Sequence(1, 2, 3, 4);
sequence.addNumber(value: 10);
sequence.addNumber(value: 20);

let sumStrategy = SumStrategy();
let multiPlyStrategy = MutiplyStrategy();

let sum = sequence.compute(strategy: sumStrategy);
let multiply = sequence.compute(strategy: multiPlyStrategy);
print("sum: \(sum)");
print("multiply: \(multiply)");

做法很简单。 所有的算法遵循统一的协议。

相关文章

  • 设计模式(二) Strategy

    前言 定义: 定义一系列的算法,并且将每个算法封装起来,算法之间还可以互相替换。本模式使得算法可以独立于使用它的客...

  • Android中的设计模式之策略模式

    参考 《设计模式:可复用面向对象软件的基础 》5.9 Strategy--对象行为型模式 《设计模式解析》(第二版...

  • 前端面试题整理

    1、设计模式 知道什么是singleton, factory, strategy, decrator么? 设计模式...

  • 简说设计模式之策略模式

    前言:对于设计模式基础概念可以去看[简说设计模式之设计模式概述] 一、什么是策略模式 策略(Strategy)模式...

  • 设计模式-策略模式

    设计模式-策略模式 定义 策略模式(Strategy Pattern)也叫政策模式(Policy Pattern)...

  • Strategy(策略) - java 源码中的策略模式

    标签(空格分隔): 设计模式 前言 Strategy(策略)设计模式是设计架构时候常用到的设计模式之一。我们开发中...

  • 设计模式-strategy

    策略模式是一种封装,将不同的算法用策略模式封装起来。在这个模式中,用到了工厂模式。 例子 从上面可以看到,通过使用...

  • 设计模式---Strategy模式

    1.什么是Strategy模式(策略模式) 策略模式,举个现实应用开发的例子:在我们的程序设计中,如果需要提供多种...

  • Strategy模式(设计模式)

    中心主旨:整体的替换算法 Strategy:策略,也就是算法的意思;这些都是为了解决问题; 这种模式主要目的是可以...

  • 状态模式,命令模式和策略模式的区别

    设计模式中有三个模式State, Command, Strategy,这三种设计模式都是行为型设计模式,在结构上又...

网友评论

    本文标题:设计模式(二) Strategy

    本文链接:https://www.haomeiwen.com/subject/wixgcctx.html