Python使用策略模式实现绘图功能

策略模式(Strategy Pattern):允许定义一系列算法,将它们封装起来,使得它们可以互换。

实现绘制不同类型的图表(如折线图、柱状图和饼图)功能。

下面是一个示例,展示如何传入横坐标和纵坐标内容,然后绘制不同类型的图表。

python 复制代码
import matplotlib.pylab as plt
from abc import ABC, abstractmethod

class PlotStrategy(ABC):
    # 抽象类:强制子类实现此方法
    @abstractmethod
    def plot(self, x_data, y_data, desc):
        pass

class LinePlotStrategy(PlotStrategy):
    def plot(self, x_data, y_data, desc):
        print('折线图')
        plt.plot(x_data,y_data,marker=0)
        plt.title(desc[0])
        plt.xlabel(desc[1])
        plt.ylabel(desc[2])
        plt.show()

class BarPlotStrategy(PlotStrategy):
    def plot(self, x_data, y_data, desc):
        print('柱状图')
        plt.bar(x_data, y_data)
        plt.title(desc[0])
        plt.xlabel(desc[1])
        plt.ylabel(desc[2])
        plt.show()

class PiePlotStrategy(PlotStrategy):
    def plot(self, x_data, y_data, desc):
        print('饼图')
        labels = x_data
        sizes = y_data
        plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=140)
        plt.axis('equal') # 正圆形
        plt.title(desc[0])
        plt.show()


# Context类持有PlotStrategy的引用。可以通过set_strategy方法动态地更改策略
class Context:
    def __int__(self, strategy: PlotStrategy):
        # _ 开头的变量,表示这是一个受保护的变量
        # 该变量只在类内部及其子类中使用,而不应在类外部直接访问
        self._strategy = strategy

    def set_strategy(self,strategy: PlotStrategy):
        self._strategy = strategy

    def execute_strategy(self, x_data, y_data, desc):
        self._strategy.plot(x_data, y_data, desc)


x = ['A','B','C']
y = [2,3,6]
desc = ['title','x','y']

# line = LinePlotStrategy().plot(x, y, desc)
# bar = BarPlotStrategy().plot(x,  y, desc)
# pie = PiePlotStrategy().plot(x,  y, desc)

context = Context()

context.set_strategy(LinePlotStrategy())
context.execute_strategy(x,  y, desc)

context.set_strategy(BarPlotStrategy())
context.execute_strategy(x,  y, desc)

context.set_strategy(PiePlotStrategy())
context.execute_strategy(x,  y, desc)

折线图

柱状图

饼图

相关推荐
平凡之路无尽路1 天前
智能体设计模式:构建智能系统的实践指南
人工智能·设计模式·自然语言处理·nlp·aigc·vllm
冷崖2 天前
工厂模式-创建型
c++·设计模式
何中应2 天前
【面试题-5】设计模式
java·开发语言·后端·设计模式·面试题
沐森2 天前
在实战中运用泛型和动态trait(特质)
设计模式
lomocode2 天前
改一个需求动 23 处代码?你可能踩进了这个坑
后端·设计模式
喷火龙8号2 天前
JWT 认证方案深度对比:单 Token 扩展刷新 vs 双 Token 验证
后端·设计模式·架构
fakerth3 天前
【OpenHarmony】设计模式模块详解
c++·单例模式·设计模式·openharmony
alibli3 天前
一文学会设计模式之创建型模式及最佳实现
c++·设计模式
1024肥宅3 天前
前端常用模式:提升代码质量的四大核心模式
前端·javascript·设计模式
郝学胜-神的一滴3 天前
设计模式依赖于多态特性
java·开发语言·c++·python·程序人生·设计模式·软件工程