美文网首页
命令模式

命令模式

作者: 沫粢泪虞 | 来源:发表于2019-03-02 15:41 被阅读0次

1.定义

面向协议编程,将所有的功能抽象为协议
第一点:将一个请求  封装成一个对象,从而让用户使用不同的请求将客户端参数化
第二点:对请求排队或者记录请求日志,以及支持撤销操作

2.应用场景

当需要将方法调用包装成一个对象,一延迟方法调用,或者让其他组件在对其内部实现细节不了解的情况下进行调用的时候可以使用命令模式
场景一:应用程序支持撤销和恢复
场景二:记录请求日志,当系统故障这些命令可以重新被执行
场景三:想用对象参数化一个动作以执行操作,并且用不同命令对象来替换回调函数

3.角色划分

自己写框架、看框架,分析每一个类是什么角色
角色一:接收者
角色二:命令接口(协议)
角色三:具体的命令 (任务:遵循协议/命令接口)
角色四:请求者  (任务:执行命令)

4.具体案例

每个角色之间的关系和调用
案例:电脑关机和开机

4.1确定角色:

1.命令接口:Computer_CommandProtocol
2.具体分类->实现类
    两个:开机、关机
    开机:MacStartupCommand 遵循< Computer_CommandProtocol >
    关机:MacShutdownCommand 遵循< Computer_CommandProtocol >
3.接收者->电脑接收命令->MacComputer
4.请求者->invoker

4.2关联角色:

首先:关联请求者 MacInvoker
其次:实现接受者 MacComputer
最后:实现命令角色 MacStartupCommand  MacShutdownCommand

4.3相关代码:

4.3.1 Computer_CommandProtocol

Computer_CommandProtocol.h

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@protocol Computer_CommandProtocol <NSObject>
//命令接口
- (void)execute;
@end

NS_ASSUME_NONNULL_END

4.3.2 MacStartupCommand

MacStartupCommand.h
#import <Foundation/Foundation.h>
#import "Computer_CommandProtocol.h"
#import "MacComputer.h"

NS_ASSUME_NONNULL_BEGIN
//命令角色特点:持有接收者的引用
@interface MacStartupCommand : NSObject <Computer_CommandProtocol>
- (instancetype)init:(MacComputer *)computer;
@end

NS_ASSUME_NONNULL_END
MacStartupCommand.m
#import "MacStartupCommand.h"

@interface MacStartupCommand ()
@property (strong, nonatomic) MacComputer *computer;
@end

@implementation MacStartupCommand

- (instancetype)init:(MacComputer *)computer
{
    self = [super init];
    if (self) {
        _computer = computer;
    }
    return self;
}

//实现协议
- (void)execute {
    //具体实现
    [_computer startup];
}

@end

4.3.3 MacShutdownCommand

MacShutdownCommand.h

#import <Foundation/Foundation.h>
#import "Computer_CommandProtocol.h"
#import "MacComputer.h"

NS_ASSUME_NONNULL_BEGIN

@interface MacShutdownCommand : NSObject <Computer_CommandProtocol>
- (instancetype)init:(MacComputer *)computer;
@end

NS_ASSUME_NONNULL_END

MacShutdownCommand.m

#import "MacShutdownCommand.h"
@interface MacShutdownCommand ()
@property (strong, nonatomic) MacComputer *computer;
@end

@implementation MacShutdownCommand
- (instancetype)init:(MacComputer *)computer
{
    self = [super init];
    if (self) {
        _computer = computer;
    }
    return self;
}

//实现协议
- (void)execute {
    //具体实现
    [_computer shutdown];
}

@end

4.3.4 MacComputer

MacComputer.h

NS_ASSUME_NONNULL_BEGIN

@interface MacComputer : NSObject
//开机
- (void)startup;
//关机
- (void)shutdown;
@end

NS_ASSUME_NONNULL_END

MacComputer.h

#import "MacComputer.h"
//接收者
@implementation MacComputer
//开机
- (void)startup {
    NSLog(@"开机");
}
//关机
- (void)shutdown {
    NSLog(@"关机");
}

@end

4.3.5 MacInvoker

MacInvoker.h

#import <Foundation/Foundation.h>
#import "MacStartupCommand.h"
#import "MacShutdownCommand.h"

NS_ASSUME_NONNULL_BEGIN
//请求者->执行命令
//持有命令对象的引用
@interface MacInvoker : NSObject
//所有的命令通过客户端来决定(或者通过函数内部决定也可以)
- (instancetype)init:(MacStartupCommand *)startup shutDown:(MacShutdownCommand *)shutDown ;
//开机
- (void)startup;
//关机
- (void)shutdown;
@end

NS_ASSUME_NONNULL_END

MacInvoker.m

#import "MacInvoker.h"

@interface MacInvoker ()
@property (strong, nonatomic) id <Computer_CommandProtocol> startupCommand;
@property (strong, nonatomic) id <Computer_CommandProtocol> shutDownCommand;
//父类引用指向子类的实例对象(面向对象编程)
//@property (strong, nonatomic) MacStartupCommand *startupCommand;
//@property (strong, nonatomic) MacShutdownCommand *shutDownCommand;


@end
//请求者
@implementation MacInvoker
- (instancetype)init:(MacStartupCommand *)startup shutDown:(MacShutdownCommand *)shutDown {
    self = [super init];
    if(self) {
        _startupCommand = startup;
        _shutDownCommand = shutDown;
    }
    return self;
}

- (void)startup {
    //调用命令
    [_startupCommand execute];
}

- (void)shutdown {
    //调用命令
    [_shutDownCommand execute];
}

@end

相关文章

  • 12.vim的使用技巧

    命令模式 、命令行模式、编辑模式: INSERT 首次进入文件: 命令模式输入: 表示 命令行模式出现...

  • 五、Linux vim编辑器

    vim编辑器三种模式:命令模式、编辑模式、末行模式 1.命令模式: vim进入文件后就是命令模式 1.1 命令模式...

  • 终端操作文件

    VIM 模式切换从命令模式->编辑模式:i,a,o,I,A,O从编辑模式->命令模式:ESC从命令模式->末行模式...

  • vim 操作 && Mac 配置本地Apache

    一、vim 的基本命令操作 vim 的模式: 编辑模式 ,命令模式 编辑模式: 命令模式:可以通过命令 最重要的命...

  • Vim高效编辑器

    Vim程序员高效编辑器 命令模式,输入模式,底线命令模式 默认进入vim就是命令模式,输入i变为输入模式 命令模式...

  • Command模式

    命令模式(Command) 命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Tran...

  • 设计模式详解——命令模式

    本篇文章介绍一种设计模式——命令模式。本篇文章内容参考《JAVA与模式》之命令模式。 一、命令模式的概念 命令模式...

  • Vi编辑器

    命令模式 文本输入模式 末行模式。 插入模式 移动光标: 删除命令: 撤销命令: 重复命令 文本行移动: 复制粘贴...

  • JavaScript设计模式七(命令模式)

    JavaScript设计模式七(命令模式) 定义: 命令模式是最简单和优雅的模式之一,命令模式中的命令指的是一个执...

  • Cisco 路由器配置命令大全(二)

    (1)模式转换命令 用户模式----特权模式,使用命令"enable"特权模式----全局配置模式,使用命令"co...

网友评论

      本文标题:命令模式

      本文链接:https://www.haomeiwen.com/subject/fyweuqtx.html