文章

设计模式-策略模式

应用场景

策略模式与状态模式很像, 都属于行为模式. 从最终呈现的UML类图上来看可能两者没什么太大区别.

区别在于, 状态模式主要目的是让主体可以依据不同的状态确定行为. 比如不同的工具执行不同的操作.

策略模式则主要用来封装算法, 主体状态并没有变化, 但是可以自由组合要执行的行为方式.

举例来说, 编写一个简单的图片文件处理程序, 需要将给定的图片进行压缩, 然后为其添加滤镜.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import abc


class ImageCompresser(abc.ABC):

    @abc.abstractmethod
    def compress(self, name):
        pass


class PngCompresser(ImageCompresser):

    def compress(self, name):
        print(f"compressing png file {name}")


class JpegCompresser(ImageCompresser):

    def compress(self, name):
        print(f"compressing jpeg file {name}")


class ImageFilter(abc.ABC):

    @abc.abstractmethod
    def apply(self, name):
        pass


class BlackAndWhiteFilter(ImageFilter):

    def apply(self, name):
        print(f"apply black and white filter for {name}")


class BlurFilter(ImageFilter):

    def apply(self, name):
        print(f"apply blur filter for {name}")


class ImageHandler:

    def handle_image(self, name,
                     *filters: ImageFilter,
                     compressor: ImageCompresser = None):
        if compressor:
            compressor.compress(name)

        for img_filter in filters:
            img_filter.apply(name)

        print(f"saving image:{name}")
        print("done.")


if __name__ == "__main__":

    handler = ImageHandler()
    handler.handle_image("some image",
                         BlackAndWhiteFilter(), BlurFilter(),
                         compressor=PngCompresser())

本文由作者按照 CC BY 4.0 进行授权