工作生活

设计模式(二) Strategy

2019-07-01  本文已影响0人  jianshudxw

前言

定义:

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

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 };
        }
    }
}

缺点:

策略模式 实现

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)");

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

上一篇 下一篇

猜你喜欢

热点阅读