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)

折线图

柱状图

饼图

相关推荐
是2的10次方啊9 小时前
设计模式与生活⑬:你坐几号线,谁来运营是另一回事
设计模式
Tt有了t1 天前
设计模式速查
java·python·设计模式
一条Go1 天前
四个进程,一把锁:Alioth 的告警评测为什么不需要消息队列
后端·设计模式·架构
一缕82年的清风1 天前
被中产唾弃的“十元快剪”,藏着最狠的极客工程学
人工智能·设计模式
是2的10次方啊1 天前
设计模式与生活⑫:周报又到手,别从空白开始
设计模式
拆房老料2 天前
DeepSeek Super-agent 架构解析:从单任务 Agent 到持续运行的任务系统
人工智能·设计模式·系统架构
AlanAshley2 天前
四种镜像文件在各操作系统的使用用法及区别
策略模式·虚拟机
工一木子2 天前
设计模式与生活⑩:地铁没变,你换了个状态
设计模式
是2的10次方啊2 天前
设计模式与生活⑪:地铁里被打扰,别总靠自己硬扛
设计模式
高晶3 天前
SPMI 控制器 RTL 设计与验证新手入门
设计模式·程序员·架构