本文使用信号发生器为例说明策略模式的用法。首先是发生器基类:

 

class Generator:    # 初始化函数    # period:周期    def __init__(self, period):        self.period= period    # 计算输入值折算到最后一个周期时的占比    def rate(self, t):        return(t - int(t / self.period) * self.period)/ self.period    # 计算输出    def output(self, t):        pass

发生器基类Gererator定义了策略接口output,其功能是根据输入的时间值计算对应的输出数据。由于信号发生器的周期性,因此在实际的处理中只要将时间值折算到一个周期之内再计算结果即可,这个折算功能就是rate方法。接下来就是具象策略类正弦发生器SinGerneator和方波发生器SquareGenerator,具体实现如下:

 

 

class SinGenerator(Generator):    def __init__(self,period):        Generator.__init__(self, period)    # 计算输出    def output(self, t):        returnsin(2 * 3.1415926* self.rate(t))class SquareGenerator(Generator):    def __init__(self,period):        Generator.__init__(self, period)    # 计算输出    def output(self, t):        if self.rate(t) < 0.5:            return-1        else:

两个具象类分别实现了output方法以输出正弦数据和方波数据。为了体验发生器策略的功能,我们设计了如下的小程序。

 

 

def test_strategy(generator):    result = ''    # 正好输出一个周期    for t in range(0, 16):        # 调用策略接口        value= generator.output(t)        # 格式化输出        result= result + '{:+.2f},'.format(round(value, 2))    print(result)
if __name__ == '__main__': # 使用正弦策略,周期20 test_strategy(SinGenerator(16)) # 使用方波策略,周期20 test_strategy(SquareGenerator(16))

代码使用完全相同的逻辑,使用了两个信号发生器。以下是其程序执行结果:

 

 

+0.00,+0.38,+0.71,+0.92,+1.00,+0.92,+0.71,+0.38,+0.00,-0.38,-0.71,-0.92,-1.00,-0.92,-0.71,-0.38,-1.00,-1.00,-1.00,-1.00,-1.00,-1.00,-1.00,-1.00,+1.00,+1.00,+1.00,+1.00,+1.00,+1.00,+1.00,+1.00,

 

通过替换发生器策略,我们得到了完全不同的输出。

 

觉得本文有帮助?请分享给更多人。

阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】