迭代器模式与命令模式详解(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、 命令模式的结果其实就是接收方的执行结果,但是为了以命令的形式进行架构,解耦请求与

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

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


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


目录
相关文章
|
2月前
|
人工智能 自然语言处理 监控
开源生态构建:从6个GitHub仓库到金融AI工具链
开源金融AI技能库:56个场景全覆盖 实战代码:基于 financial-ai-skills 项目 | 开源生态 | 场景覆盖 | 贡献指南 项目概览 `` financial-ai-skills/ ├── README.md ├── LICENSE (MIT) ├── skills/ │ ├── financial-intelligence/ # 财务智能 (8个场景) │ ├──
|
2月前
|
存储 人工智能 运维
阿里云百炼大模型平台全解:入口、免费额度领取与API调用实战
阿里云百炼是一站式大模型服务平台,依托通义实验室技术,集模型调用、多模态生成、智能体开发、应用部署、安全运维于一体,覆盖个人、团队、企业全场景需求。平台整合文本、图像、视频、多模态全品类模型,提供低代码开发框架与全链路安全管控,支持开箱即用与二次开发,适配内容创作、软件开发、企业智能服务等领域。
1075 0
|
人工智能 自然语言处理 监控
掌握这6大环节,设计懂你所问的AI智能问答系统
三桥君深入解析企业智能化升级核心——AI大脑的构建路径。从RPA流程自动化、AI能力、AI中台到IoT平台,结合行业解决方案,助力企业实现智能运营,提升竞争力
791 5
|
9月前
|
传感器 人工智能 算法
学生二次开发机器人平台完全指南:从入门到实战的选型与开发路径
本文系统解析适合学生二次开发的机器人平台,涵盖开放性、学习曲线与成本平衡等核心特征,对比服务机器人、开源底盘、双足/四足平台及DIY套件,指导学生按预算、技术方向与应用场景科学选型,并提供实战开发路径与职业发展建议。
|
9月前
|
数据采集 测试技术 开发者
Python进阶之路:模块、包与异常处理的实战指南
本文通过实战案例详解Python模块化开发与异常处理核心技巧。涵盖模块导入、包结构设计、自定义异常、错误日志等关键实践,帮助开发者从写出能运行的代码进阶到构建可维护、健壮的项目,提升协作效率与工程能力。(238字)
305 0
|
存储 数据可视化 搜索推荐
数据可视化实战:如何采集并分析马蜂窝上的热门旅游信息?
通过自动化工具抓取马蜂窝旅游数据,分析杭州热门景点与用户关注焦点,生成排行榜和词云图。项目采用低成本方案,结合Playwright模拟浏览器行为采集信息,并用Python处理数据、绘制图表。结果显示西湖、灵隐寺等为热门景点,游客多关注门票、交通等问题。此方法简单高效,适合个性化旅行攻略分析。
999 8
数据可视化实战:如何采集并分析马蜂窝上的热门旅游信息?
|
JavaScript IDE 开发工具
python中的SyntaxError: invalid character in identifier(语法错误:标识符中有无效字符)
【5月更文挑战第14天】python中的SyntaxError: invalid character in identifier(语法错误:标识符中有无效字符)
2507 8
|
设计模式 供应链 安全
【再谈设计模式】中介者模式 - 协调对象间交互的枢纽
中介者模式定义了一个中介对象来封装一组对象之间的交互方式。中介者使得各对象之间不需要显式地相互引用,从而降低了它们之间的耦合度。它通过将对象之间的交互逻辑集中到中介者对象中,使得系统的结构更加清晰,易于维护和扩展。
516 18
【再谈设计模式】中介者模式 - 协调对象间交互的枢纽
|
XML 机器学习/深度学习 人工智能
CLaMP 3:音乐搜索AI革命!多模态AI能听懂乐谱/MIDI/音频,用27国语言搜索全球音乐
CLaMP 3是由清华大学团队开发的多模态、多语言音乐信息检索框架,支持27种语言,能够进行跨模态音乐检索、零样本分类和音乐推荐等任务。
1505 1
CLaMP 3:音乐搜索AI革命!多模态AI能听懂乐谱/MIDI/音频,用27国语言搜索全球音乐
|
测试技术 API
接口设计原则与最佳实践指南
接口设计原则与最佳实践指南