策略模式:设计模式系列(九)

  策略模式(Strategy Pattern):是将一系列的算法封装起来,调用者根据需要可以只通过一个对象调用这些算法方法的设计模式,归类为行为型模式。

  这一模式的解读分为以下几个方面:

  • 算法方法有很多,且都可以把本质抽象出来。
  • 算法方法被封装后,可以统一被一个对象调用。
  • 调用算法方法的对象在调用前要知道可以调用什么。

  使用策略模式的思考过程如下:

  1. 有一系列的算法希望被一个对象调用。
  2. 所以把这些算法都封装成一个个实现类。
  3. 这些算法实现类对象就成了调用他们的对象的参数。

  明确一下结构,策略模式结构包含调用策略的实现类、策略实现类、策略实现类抽象出来的接口或协议。

状态模式示例代码如下(Swift语言):

class ObjectContext{
    
    private var strategy:StrategyBluePrint?;
    
    func setStrategy(objectState:StrategyBluePrint){
        
        self.strategy = objectState;
    }
    
    func algorithm(){
        self.strategy!.handler(self);
    }
}

protocol StrategyBluePrint{
    
    func handler(context:ObjectContext);
}

class Strategy1: StrategyBluePrint{
    
    func handler(context:ObjectContext){
        print("Strategy 1");
    }
}

class Strategy2: StrategyBluePrint{
    
    func handler(context:ObjectContext){
        print("Strategy 2");
    }
}

class Strategy3: StrategyBluePrint{
    
    func handler(context:ObjectContext){
        print("Strategy 3");
    }
}

var context = ObjectContext();

context.setStrategy(Strategy1());
context.algorithm();
context.setStrategy(Strategy2());
context.algorithm();
context.setStrategy(Strategy3());
context.algorithm();

  代码分析:ObjectContext实例化对象context是一个可以调用一系列策略的对象,实例化后,需要调用策略,需要知道策略是什么,所以需要有一个setStrategy的过程,在调用algorithm方法执行。以上代码输出结果如下:

Strategy 1
Strategy 2
Strategy 3

  总结:策略模式是一个跟状态模式很相似的设计模式,区别之处在于策略模式调用的策略是需要调用者知道然后调用的,而状态模式的状态却是非透明自动转换的,因为他们的结构相似,所以具有一样的良好扩展性,解放了控制流语句,而因为策略模式跟状态模式的差别,策略模式需要知道具体策略是什么,在设置里才能调用,但是相比起状态模式,要低耦合。


lZackx © 2022. All rights reserved.

Powered by Hydejack v9.1.6