Three20命令模式:封装iOS用户操作逻辑
你是否在iOS开发中遇到过用户操作逻辑混乱、撤销/重做功能难以实现的问题?Three20框架的命令模式(Command Pattern)为这些痛点提供了优雅解决方案。本文将通过实际场景解析,带你掌握如何使用Three20封装用户操作,提升代码可维护性和扩展性。读完本文你将获得:命令模式核心原理、Three20实现方式、3个实战案例及完整代码模板。
命令模式基础:分离请求与执行
命令模式通过将用户操作封装为对象,实现请求发送者与执行者的解耦。在iOS开发中,这一模式特别适用于处理按钮点击、手势操作等交互逻辑。Three20框架虽未提供专门的命令模式基类,但通过其UI组件设计理念,可以构建符合命令模式的架构。
核心角色划分
- 命令接口(Command):定义执行操作的协议
- 具体命令(ConcreteCommand):实现命令接口,绑定接收者
- 调用者(Invoker):触发命令执行的对象(如UIButton)
- 接收者(Receiver):实际执行操作的对象
Three20中的命令模式实现
Three20作为Objective-C的iOS开发库,其UI组件设计天然支持命令模式的实现。以下是基于Three20构建命令模式的基础结构:
// 命令协议定义
@protocol TTCommand <NSObject>
- (void)execute;
- (void)undo;
@end
// 具体命令实现
@interface TTSimpleCommand : NSObject <TTCommand>
- (instancetype)initWithTarget:(id)target action:(SEL)action;
@end
// 调用者实现(Three20按钮)
@implementation TTButton (CommandPattern)
- (void)setCommand:(id<TTCommand>)command {
_command = command;
[self addTarget:self action:@selector(onClick) forControlEvents:UIControlEventTouchUpInside];
}
- (void)onClick {
[_command execute];
}
@end
实战案例:购物车操作管理
添加商品命令实现
@interface AddToCartCommand : NSObject <TTCommand>
- (instancetype)initWithCart:(ShoppingCart *)cart product:(Product *)product;
@end
@implementation AddToCartCommand
- (void)execute {
[_cart addProduct:_product];
_previousCount = _cart.items.count - 1;
}
- (void)undo {
if (_previousCount >= 0) {
[_cart removeProduct:_product];
}
}
@end
命令管理器设计
使用Three20的TTObject作为基类,实现命令的历史记录管理:
@interface TTCommandManager : TTObject
- (void)executeCommand:(id<TTCommand>)command;
- (void)undoLastCommand;
@end
@implementation TTCommandManager
- (void)executeCommand:(id<TTCommand>)command {
[command execute];
[_commandHistory addObject:command];
}
- (void)undoLastCommand {
id<TTCommand> lastCommand = [_commandHistory lastObject];
[lastCommand undo];
[_commandHistory removeLastObject];
}
@end
撤销/重做功能优化
通过Three20的TTNavigationController实现跨页面的命令历史管理:
@implementation TTNavigationController (CommandSupport)
- (TTCommandManager *)commandManager {
if (!_commandManager) {
_commandManager = [[TTCommandManager alloc] init];
}
return _commandManager;
}
@end
最佳实践与注意事项
- 命令粒度控制:单个命令应只负责一个原子操作
- 内存管理:使用weak引用避免命令对象持有UI组件
- 线程安全:在多线程环境下需添加命令执行锁
总结与迁移建议
Three20虽已停止维护,但命令模式的设计思想仍具有重要参考价值。对于仍在使用Three20的项目,可参考本文实现用户操作封装;新项目建议迁移至NimbusKit等活跃维护的框架。完整代码示例可在项目仓库中查看,仓库地址:https://gitcode.com/gh_mirrors/th/three20。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



