策略模式(Strategy Pattern):允许定义一系列算法,将它们封装起来,使得它们可以互换。
实现绘制不同类型的图表(如折线图、柱状图和饼图)功能。
下面是一个示例,展示如何传入横坐标和纵坐标内容,然后绘制不同类型的图表。
import matplotlib.pylab as plt
from abc import ABC, abstractmethodclass PlotStrategy(ABC):# 抽象类:强制子类实现此方法@abstractmethoddef plot(self, x_data, y_data, desc):passclass 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_datasizes = y_dataplt.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 = strategydef set_strategy(self,strategy: PlotStrategy):self._strategy = strategydef 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)
折线图
柱状图
饼图