设计模式(二) Strategy

前言

定义:

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

  • 不用修改源码或继承的方式扩展原类的方法。
  • 行为型的设计模式。
  • 自我认识,在实现上是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)");

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容