策略模式(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)
折线图
柱状图
饼图