Python 设计模式中命令模式
作者:范桂飓 发布时间:2022-10-14 20:28:36
标签:Python,设计,命令,模式
1.命令模式
命令模式的目的是解耦调用操作的对象(调用者)和提供实现的对象(接收者)。
命令模式的思路是在调用者和接收者之间插入一个命令类(Command
),该命令类定义了一个 execute
接口,并且该接口实际上是调用了接收者中的具体方法来执行具体命令,以此可以通过扩展命令子类来扩展多个不同的接收者。
这样调用此命令的调用者就和命令接收者之间解耦了。
优势:
封装性好,每个命令都被封装起来,对于客户端来说,需要什么功能就去调用相应的命令,而无需知道命令具体是怎么执行的。
扩展性好,在接收者类中一般会对操作进行最基本的封装,命令类则通过对这些基本的操作进行二次封装。
复用性好,当增加新命令的时候,对命令类的编写一般不是从零开始的,有大量的接收者类可供调用,也有大量的命令类可供调用。
2.应用场景
菜单驱动文本编辑器:调用者是菜单,接收者是被编辑的文档。
3.代码示例
实体角色:
抽象的命令基类(Command):命令的抽象类,定义命令的接口,可以理解为一个基类。
具体的命令实现类(ConcreteCommand):命令接口实现对象,通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
命令接受者(Receiver):真正接收并执行具体命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
命令调用者(Invoker):对命令进行调用,然后将命令发送给接收者。通常会持有命令对象,可以持有很多的命令对象,相当于使用命令对象的入口。
命令装配者(Client):客户端会创建具体的命令对象,组装命令对象和接收者。
class Command:
"""声明命令模式接口"""
def __init__(self, obj):
self.obj = obj
def execute(self):
pass
class ConcreteCommand(Command):
"""实现命令模式接口"""
def execute(self):
self.obj.run()
class Invoker:
"""接受命令并执行命令的接口"""
def __init__(self):
self._commands = []
def add_command(self, cmd):
self._commands.append(cmd)
def remove_command(self, cmd):
self._commands.remove(cmd)
def run_command(self):
for cmd in self._commands:
cmd.execute()
class Receiver:
"""具体动作"""
def __init__(self, word):
self.word = word
def run(self):
print(self.word)
def client():
"""装配者"""
test = Invoker()
cmd1 = ConcreteCommand(Receiver('命令一'))
test.add_command(cmd1)
cmd2 = ConcreteCommand(Receiver('命令二'))
test.add_command(cmd2)
cmd3 = ConcreteCommand(Receiver('命令三'))
test.add_command(cmd3)
test.run_command()
if __name__ == '__main__':
client()
来源:https://blog.csdn.net/Jmilk/article/details/122929761
0
投稿
猜你喜欢
- 这篇论坛文章(赛迪网技术社区)主要介绍了配置一个高可用性的MySQL服务器负载均衡群集的具体过程,详细内容请参考下文:本文将告诉你如何配置一
- #!/usr/bin/env pythonimport sockets = socket.socket(socket.AF_PACKET,
- 这是来自于Steven D编写的WEB前端开发设计要点的内容。虽然许多设计师已非常熟练的使用了Web标准,让人遗憾的是有很多细节的排版处理仍
- 如何用通过Web访问OLAP数据? <% Set Conn=Server.CreateObject(″A
- 散点图,顾名思义是一些散乱的点构成的图。那么这些散乱的点有什么作用呢?散点图通过用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是
- 下面是虚机维护中,经常碰到的一些ASP程序中的数据库调用的错误,现收集整理如下:
- 前言写过的这些脚本有一个共性,都是和web相关的,总要用到获取链接的一些方法,累积不少爬虫抓站的经验,在此总结一下,那么以后做东西也就不用重
- Python 使用tf-idf算法计算文档关键字权重,并生成词云1. 根据tf-idf计算一个文档的关键词或者短语:代码如下:注意需要安装p
- 字符替换是一个非常重要的功能,javascript 中有一个 String.replace( ),但是此方法有
- 我们想要知道数目的总和,只要通过+就能实现,这是我们在做题上经常用到的符号。但是在python中不能直接使用,我们需要借助一些代码或者函数帮
- 目录1.函数的介绍2.函数的定义和调用3.函数的参数4.参数的分类4.1.位置参数4.2.关键字参数4.3.缺省参数4.4.不定长参数1.不
- 一、dict推导式list1 = ['name', 'age', 'gender']list
- 在python显示图象时,我们用matplotlib模块时会遇到图像色彩失真问题,究竟是什么原因呢,下面就来看看究竟。待显示图像为:impo
- python将字典内容写入json文件的方法:我们可以先使用json.dumps()函数将字典转换为字符串;然后再将内容写入json即可。j
- 邹建 2004.4 代码如下:/*--调用示例 exec p_lockinfo1 --*/ alter proc p_lockinfo1
- 前言我们先说一下思路:先对目标网站发送请求,获取html源码,然后对源码里面的所以图片链接进行筛选,然后再次对图片链接发送请求,然后保存。思
- 首先说明,Supervisor 只能安装在 Python 2.x 环境中!但是基本上所有的 Linux 都同时预装了 Python 2.x
- 面是我下载页面down.php 的php代码 现在我发现,用迅雷,谷歌浏览器直接打开,就能输出下载文件,一点不起防盗链作用。&nb
- 效果演示基础源码1.基础设置(tools部分)这个部分设置马里奥以及游戏中蘑菇等怪的的移动设置。import osimport pygame
- DB2 存储过程:基础知识您在客户端工作站上对远程服务器和位于该服务器上的数据库进行分类的任何时候,都存在一个简单的 DB2 客户端/服务器