迭代器模式与命令模式详解(4)

简介: 迭代器模式与命令模式详解(4)

创建命令接口 IAction类:


public interface IAction {
    void execute();
}


然后分别创建操作播放器可以接受的指令,播放指令PlayAction类 :


public class PlayAction implements IAction {
    private GPlayer gplayer;
    public PlayAction(GPlayer gplayer) {
        this.gplayer = gplayer;
    }
    public void execute() {
        gplayer.play();
    }
}


暂停指令PauseAction类 :


public class PauseAction implements IAction {
    private GPlayer gplayer;
    public PauseAction(GPlayer gplayer) {
        this.gplayer = gplayer;
    }
    public void execute() {
        gplayer.pause();
    }
}


拖动进度条指令SpeedAction类 :


public class SpeedAction implements IAction {
    private GPlayer gplayer;
    public SpeedAction(GPlayer gplayer) {
        this.gplayer = gplayer;
    }
    public void execute() {
        gplayer.speed();
    }
}


停止播放指令StopAction类 :


public class StopAction implements IAction {
    private GPlayer gplayer;
    public StopAction(GPlayer gplayer) {
        this.gplayer = gplayer;
    }
    public void execute() {
        gplayer.stop();
    }
}


最后 ,创建控制条Controller类 :


public class Controller {
    private List<IAction> actions = new ArrayList<IAction>();
    public void addAction(IAction action){
        actions.add(action);
    }
    public void execute(IAction action){
        action.execute();
    }
    public void executes(){
        for (IAction action:actions) {
            action.execute();
        }
        actions.clear();
    }
}


从上面代码来看,控制条可以执行单条命令,也可以批量执行多条命令。下面来看客户端测试代码:\


public class Test {
    public static void main(String[] args) {
        GPlayer player = new GPlayer();
        Controller controller = new Controller();
        controller.execute(new PlayAction(player));
        controller.addAction(new PauseAction(player));
        controller.addAction(new PlayAction(player));
        controller.addAction(new StopAction(player));
        controller.addAction(new SpeedAction(player));
        controller.executes();
    }
}


运行效果如下:


正常播放
暂停播放
正常播放
停止播放
拖动进度条


由于控制条已经与播放器内核解耦了,以后如果想扩展新命令,只需增加命令即可,控制条


的结构无需改动。


七、命令模式在源码中的体现


由于控制条已经与播放器内核解耦了,以后如果想扩展新命令,只需增加命令即可,控制条


的结构无需改动。


public interface Runnable { 
    public abstract void run();
}


实际上调用线程的start()方法之后,就有资格去抢CPU资源,而不需要我们自己编写获得 CPU资源的逻辑。而线程抢到CPU资源后,就会执行run()方法中的内容,用 Runnable接口 把用户请求和CPU执行进行了解耦。


然 后 ,再看一个大家非常孰悉的junit.framework.Test接口 :


package junit.framework; 
public interface Test { 
    public abstract int countTestCases(); 
    public abstract void run(TestResult result);
}


Test接口中有两个方法,第一个是countTestCases()方法用来统计当前需要执行的测试用例 总数。第二个是run()方法就是用来执行具体的测试逻辑,其参数TestResult是用来返回测试结果的。 实际上我们在平时编写测试用例的时候,只需要实现Test接口即便认为就是一个测试用例,那 么在执行的时候就会自动识别。实际上我们平时通常做法都是继承TestCase类 ,我们不妨来看

—下 TestCase的源码:


public abstract class TestCase extends Assert implements Test { 
    ...
    public void run(TestResult result) { 
        result.run(this);
  }
    ...
}


实际上TestCase类它也实现了 Test接口。我们继承TestCase类 ,相当于也实现了 Test 接口,自然也就会被扫描成为一个测试用例。


八、命令模式的优缺点

优点:


1、通过引入中间件(抽象接口),解耦了命令请求与实现;


2、 扩展性良好,可以很容易地增加新命令;


3、 支持组合命令,支持命令队列;


4、可以在现有命令的基础上,增加额外功能(比如日志记录…,结合装饰器模式更酸爽)。


缺点:


1、 具体命令类可能过多;


2、 命令模式的结果其实就是接收方的执行结果,但是为了以命令的形式进行架构,解耦请求与

实现,引入了额外类型结构(引入了请求方与抽象命令接口),增加了理解上的困难(不过这

也是设计模式带来的一个通病,抽象必然会引入额外类型;抽象肯定比紧密难理解)。


十一、迭代器模式与命令模式详解


目录
相关文章
|
7月前
|
人工智能 文字识别 物联网
ModelScope魔搭社区发布月报 -- 26年2月
临近年关,ModelScope迎来春节模型发布潮:Qwen3、GLM-4.7、MiniMax M2.1等大模型密集上新;AIGC生图、语音合成、具身智能全面突破;OpenAPI、OAuth、Gallery等生态基建同步升级,加速AI开源普惠。(239字)
1074 7
|
6月前
|
编译器 项目管理 C语言
蓝桥杯Dev-C++ 5.11(编译器)使用细节排坑!!!
为适用各种比赛,教你如何用 DEV C++ 细节( ̄︶ ̄)↗ 
540 1
|
JavaScript IDE 开发工具
python中的SyntaxError: invalid character in identifier(语法错误:标识符中有无效字符)
【5月更文挑战第14天】python中的SyntaxError: invalid character in identifier(语法错误:标识符中有无效字符)
2500 8
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
993 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
开发框架 前端开发 网络协议
服务器开发- Asp.Net Core中的websocket,并封装一个简单的中间件
服务器开发- Asp.Net Core中的websocket,并封装一个简单的中间件
1477 119
|
存储 弹性计算 开发工具
阿里云服务器搭建好
本文详细介绍了在阿里云服务器上成功运行代码的全过程。从创建阿里云账号、选择与购买服务器开始,继而指导您安装操作系统、Python环境及Git,并设置代码仓库,上传代码。随后,文章还解释了如何配置环境变量以确保代码顺利运行,以及利用print语句和调试工具进行代码调试的方法。遵循这些步骤,即使复杂的部署流程也能轻松掌握。
421 5
|
存储 C语言
【C语言进阶篇】整数在内存的存储——原码、反码、补码
【C语言进阶篇】整数在内存的存储——原码、反码、补码
1137 0
十分钟上手把玩树莓派——系统创建指南
十分钟上手把玩树莓派——系统创建指南
409 0
|
Linux
centos6和7如何关闭和开启图形界面
centos6和7如何关闭和开启图形界面
999 1
|
消息中间件 SQL 关系型数据库
使用Flink的MySQL连接器
使用Flink的MySQL连接器
591 2

热门文章

最新文章