当前位置: 首页 > news >正文

做动漫网站如何应用数据绑定网络广告公司

做动漫网站如何应用数据绑定,网络广告公司,综合门户类网站有哪些,网络代理修复怎么解决目录 什么是命令模式 命令模式的实现 命令模式角色 命令模式类图 命令模式举例 命令模式代码实现 命令模式的特点 优点 缺点 使用场景 注意事项 什么是命令模式 命令模式(Command Pattern)是一种数据驱动的设计模式,它属…

目录

什么是命令模式     

命令模式的实现

命令模式角色

命令模式类图

命令模式举例

命令模式代码实现

命令模式的特点

优点

缺点

使用场景

注意事项


什么是命令模式     

        命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。是对命令的封装,每一个命令都是一个操作,请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

        在软件系统中,方法的请求者与方法的实现者总是存在着紧密的耦合关系,这不利于扩展和维护。如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合,变得很重要,命令模式能很好地解决这个问题。

命令模式的实现

        命令模式将请求以命令的形式包裹在对象里面,传递给调用对象,调用对象寻找匹配该命令的对象,将命令给该对象执行。其调用过程主要分为了三步:

  1. 命令被包裹在请求对象里,传递给调用对象。
  2. 调用对象查找匹配该命令(可以处理该命令)的对象,将该命令传递给匹配的对象。
  3. 该对象执行传递给它的命令。

命令模式角色

接收者角色(Receiver):该类负责具体实施或执行一个请求,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
命令角色(Command):定义需要执行的所有命令行为,需要执行的命令都在这里声明。
具体命令角色(ConcreteCommand):命令接口实现对象,是“虚”的实现;该类内部通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
请求者角色(Invoker):接收客户端的命令,并执行命令,要求命令对象执行请求,可以持有很多的命令对象。是客户端真正触发命令并要求命令执行相应操作的地方,相当于使用命令对象的入口。

命令模式类图

命令模式举例

        小女孩茱丽(Julia)有一个盒式录音机,此录音机有播音(Play)、倒带(Rewind)和停止(Stop)功能,录音机的键盘便是请求者(Invoker)角色;茱丽(Julia)是客户端角色,而录音机便是接收者角色。Command类扮演抽象命令角色,而PlayCommand、StopCommand和RewindCommand便是具体命令类。茱丽(Julia)不需要知道播音(play)、倒带(rewind)和停止(stop)功能是怎么具体执行的,这些命令执行的细节全都由键盘(Keypad)具体实施。茱丽(Julia)只需要在键盘上按下相应的键便可以了。

命令模式代码实现

接收者角色

package com.common.demo.pattern.command;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 接收者角色类* @date 2023/08/01 21:04:50*/
public class AudioPlayer {public void play(){System.out.println("播放...");}public void rewind(){System.out.println("倒带...");}public void stop(){System.out.println("停止...");}
}

命令角色

package com.common.demo.pattern.command;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 抽象命令角色类* @date 2023/08/01 21:04:34*/
public interface Command {/*** 执行方法*/void execute();
}

具体命令角色

package com.common.demo.pattern.command;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体调用者角色* @date 2023/08/01 21:07:43*/
public class ConcreteCommand implements Command {private Receiver receiver = null;/*** 构造方法*/public ConcreteCommand(Receiver receiver) {this.receiver = receiver;}@Overridepublic void execute() {//通常会转调接收者对象的相应方法,让接收者来真正执行功能receiver.action();}
}
package com.common.demo.pattern.command;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体调用者角色 倒带* @date 2023/08/01 21:07:43*/
public class RewindCommand implements Command {private AudioPlayer audioPlayer= null;/*** 构造方法*/public RewindCommand(AudioPlayer audioPlayer) {this.audioPlayer = audioPlayer;}@Overridepublic void execute() {//通常会转调接收者对象的相应方法,让接收者来真正执行功能audioPlayer.rewind();}
}
package com.common.demo.pattern.command;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体调用者角色 暂停* @date 2023/08/01 21:07:43*/
public class StopCommand implements Command {private AudioPlayer audioPlayer= null;/*** 构造方法*/public StopCommand(AudioPlayer audioPlayer) {this.audioPlayer = audioPlayer;}@Overridepublic void execute() {//通常会转调接收者对象的相应方法,让接收者来真正执行功能audioPlayer.stop();}
}

请求者角色

package com.common.demo.pattern.command;/*** @author Evan Walker  昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 请求者角色 按键* @date 2023/08/01 21:09:32*/
public class Keypad {private Command playCommand;private Command rewindCommand;private Command stopCommand;public void setPlayCommand(Command playCommand) {this.playCommand = playCommand;}public void setRewindCommand(Command rewindCommand) {this.rewindCommand = rewindCommand;}public void setStopCommand(Command stopCommand) {this.stopCommand = stopCommand;}/*** 执行播放方法*/public void play(){playCommand.execute();}/*** 执行倒带方法*/public void rewind(){rewindCommand.execute();}/*** 执行播放方法*/public void stop(){stopCommand.execute();}
}

测试代码

package com.common.demo.pattern.command;/*** @author Evan Walker  昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 客户端测试类 客户judia* @date 2023/08/01 21:10:30*/
public class ClientTest {public static void main(String[] args) {//创建接收者对象AudioPlayer audioPlayer = new AudioPlayer();//创建命令对象Command playCommand = new PlayCommand(audioPlayer);Command rewindCommand = new RewindCommand(audioPlayer);Command stopCommand = new StopCommand(audioPlayer);//创建请求者对象Keypad keypad = new Keypad();keypad.setPlayCommand(playCommand);keypad.setRewindCommand(rewindCommand);keypad.setStopCommand(stopCommand);//测试keypad.play();keypad.rewind();keypad.stop();keypad.play();keypad.stop();}
}

测试截图

命令模式的特点

优点

  1. 解耦性:解耦请求发送者和接收者,命令模式将请求封装成独立的命令对象,使得发送者和接收者之间解耦,从而降低了两者之间的直接依赖关系。
  2. 易扩展性:容易扩展新的命令,由于命令被封装成独立的对象,可以很容易地扩展新的命令类,而无需修改现有的代码。
  3. 动态组合性:命令模式把请求封装起来,可以动态地对它进行参数化、队列化和日志化等操作,从而使得系统更灵活。命令模式中的命令对象能够很容易地组合成复合命令,也就是宏命令,从而使系统操作更简单,功能更强大。

缺点

  1. 类膨胀:每个具体命令都需要一个独立的类,如果命令过多,可能导致类的数量剧增,增加了系统复杂性。
  2. 实现复杂:命令模式的实现可能比较复杂,涉及到许多额外的类和关联关系。
  3. 可能造成性能瓶颈:若系统中存在大量的命令对象,执行这些命令可能会对系统的性能造成影响。其命令是通过一个个对象来完成的,在执行命令时可能需要执行大量的对象,这可能会带来一定的时间开销。

使用场景

  1. 需要将请求发送者和接收者解耦的情况。
  2. 需要支持撤销和重做操作的场景。
  3. 需要将一系列操作封装成一个命令进行批处理的情况。
  4. 需要支持日志和事务等功能的情况。

注意事项

  1. 命令对象要尽量保持简单,只包含必要的信息,以减轻命令的负担和复杂度。
  2. 注意命令模式中对象间的引用关系。命令对象通常需要持有对接收者的引用,可以通过构造函数或属性注入方式实现。
  3. 考虑使用撤销和重做操作时,需要合理地管理命令的历史记录,以便正确地执行撤销和重做操作。
  4. 注意命令模式的适用场景,避免过度设计和滥用命令模式带来的额外复杂性。

更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)

http://www.ds6.com.cn/news/897.html

相关文章:

  • 中国最大的外包公司有哪些深圳seo优化服务商
  • 北京公司网站建设定如何推广网站
  • 网站用户体验存在问题chrome官网下载
  • 昆明网站建设论坛网站建设策划
  • 突出网站建设 突出能力优化落实防控措施
  • 盘锦市政建设集团网站软文写作是什么意思
  • 网站建设方案书备案事件营销成功案例
  • 酷虎云建站工具网络营销的主要内容包括
  • 做创意美食的视频网站宿迁网站建设制作
  • 普通电脑可以做网站服务器吗安新seo优化排名网站
  • 搜索网站排名北京网络营销推广外包
  • 百度不收入我的网站了建网站要多少钱
  • 如何快速提升网站pr新十条优化措施
  • 网站开发广东百度指数查询app
  • 网站建设衤金手指谷哥十四找培训机构的app
  • 南阳卧龙区高端网站建设价格企业培训内容
  • wordpress代码修改用户权限广州seo外包多少钱
  • wordpress如何把菜单seo推广优化官网
  • 龙华三网合一网站建设深圳搜狗seo
  • 校园网认证登录入口网站做优化好还是推广好
  • 我公司是做网站开发的怎么纳税seo外链推广工具
  • 化妆品成品网站网络优化
  • 沈阳工程招标信息网上海aso苹果关键词优化
  • mstsc做网站怎样淘宝seo排名优化
  • 男男床上爱做 网站广州seo做得比较好的公司
  • 帝国cms更改网站icoseo网络排名优化
  • 聊城做网站建设的公司站长工具樱花
  • 西安h5网站建设百度学术论文查重免费
  • 龙潭古镇网站建设北京seo排名优化网站
  • 海报在线制作免费网站免费域名的网站