- 命令模式是一种行为设计模式,他可将请求转换成一个包含与请求相关的所有信息的独立对象。
- 该转换让你能根据不同的请求将方法参数化,延迟请求执行或将其放入队列中,且能实现可撤销操作。
- 举例饭店厨师、服务员、客户下单
- 用户1点菜
- 用户2点菜
- 服务员就开始添加命令,并在最后删除了一条命令加入到自己的队列中,交给了厨师
- 厨师收到订单列表开始执行命令

#import <Foundation/Foundation.h>
#import "HCDOrder.h"
#import "HCDWorker.h"
@interface HCDOrder : NSObject
@property(nonatomic,copy)NSString *orderString;
-(instancetype)initWithOrderString:(NSString *)orderString;
-(void)executeOrder;
@end
#import "HCDOrder.h"
@implementation HCDOrder
-(instancetype)initWithOrderString:(NSString *)orderString{
self = [super init];
if (self) {
_orderString = orderString;
}
return self;
}
@end
#import "HCDOrder.h"
@interface HCDMuttonOrder : HCDOrder
@end
#import "HCDMuttonOrder.h"
@implementation HCDMuttonOrder
-(void)executeOrder{
NSLog(@"烤羊");
[[HCDWorker sharedWorker] doMuttonWork:self.orderString];
}
@end
#import "HCDOrder.h"
@interface HCDChickenOrder : HCDOrder
@end
#import "HCDChickenOrder.h"
@implementation HCDChickenOrder
-(void)executeOrder{
NSLog(@"烤鸡");
[[HCDWorker sharedWorker] doChickenWork:self.orderString];
}
@end
#import "HCDOrder.h"
@interface HCDDuckOrder : HCDOrder
@end
#import "HCDDuckOrder.h"
@implementation HCDDuckOrder
-(void)executeOrder{
NSLog(@"烤鸭");
[[HCDWorker sharedWorker] doChickenWork:self.orderString];
}
@end
#import <Foundation/Foundation.h>
@interface HCDWorker : NSObject
+(instancetype)sharedWorker;
-(void)doMuttonWork:(NSString *)work;
-(void)doChickenWork:(NSString *)work;
-(void)doDuckWork:(NSString *)work;
@end
#import "HCDWorker.h"
@implementation HCDWorker
+(instancetype)sharedWorker{
static dispatch_once_t once;
static HCDWorker *sharedWorker = nil;
dispatch_once(&once, ^{
sharedWorker = [[HCDWorker alloc]init];
});
return sharedWorker;
}
-(void)doMuttonWork:(NSString *)work{
NSLog(@"厨师考羊肉:%@",work);
}
-(void)doChickenWork:(NSString *)work{
NSLog(@"厨师考鸡肉:%@",work);
}
-(void)doDuckWork:(NSString *)work{
NSLog(@"厨师烤鸭肉:%@",work);
}
@end
#import <Foundation/Foundation.h>
#import "HCDOrder.h"
#import "HCDMuttonOrder.h"
#import "HCDChickenOrder.h"
@interface HCDWaiter : NSObject
-(void)addOrder:(HCDOrder *)order;
-(void)deleteOrder:(HCDOrder *)order;
-(void)notifyOrder;
@end
#import "HCDWaiter.h"
@interface HCDWaiter ()
@property(nonatomic,strong)NSMutableArray *orderList;
@end
@implementation HCDWaiter
-(instancetype)init{
self = [super init];
if (self) {
_orderList = [NSMutableArray array];
}
return self;
}
-(void)addOrder:(HCDOrder *)order{
NSLog(@"添加Order");
[self.orderList addObject:order];
}
-(void)deleteOrder:(HCDOrder *)order{
NSLog(@"取消Order");
[self.orderList removeObject:order];
}
-(void)notifyOrder{
NSLog(@"====开始执行Order===");
for (HCDOrder *order in self.orderList) {
[order executeOrder];
}
}
@end
#import <Foundation/Foundation.h>
@class HCDOrder,HCDMuttonOrder,HCDChickenOrder;
typedef NS_ENUM(NSUInteger,orderType){
orderTypeMutton,
orderTypeChicken,
orderTypeDuck
};
@interface HCDCustomr : NSObject
-(HCDOrder *)pushOrderWithString:(NSString *)string type:(orderType)type;
@end
#import "HCDCustomr.h"
#import "HCDMuttonOrder.h"
#import "HCDChickenOrder.h"
#import "HCDDuckOrder.h"
@implementation HCDCustomr
-(HCDOrder *)pushOrderWithString:(NSString *)string type:(orderType)type{
HCDOrder *order = nil;
switch (type) {
case orderTypeMutton:
order = [[HCDMuttonOrder alloc]initWithOrderString:string];
break;
case orderTypeChicken:
order = [[HCDChickenOrder alloc]initWithOrderString:string];
break;
case orderTypeDuck:
order = [[HCDDuckOrder alloc]initWithOrderString:string];
break;
}
return order;
}
@end
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad]
//waiter用于接收各种类型的order。waiter是请求接收者。
//接收不同customer产生的不同order,并且都存入waiter这个接受者中,type表示不同类型的order。
HCDWaiter *waiter = [[HCDWaiter alloc]init]
//顾客一
HCDCustomr *customer = [[HCDCustomr alloc]init]
HCDOrder *customerOrder1 = [customer pushOrderWithString:@"顾客一要十串羊肉" type:orderTypeMutton]
HCDOrder *customerOrder2 = [customer pushOrderWithString:@"顾客一要十串鸭肉" type:orderTypeDuck]
[waiter addOrder:customerOrder1]
[waiter addOrder:customerOrder2]
//顾客二
HCDCustomr *customer1 = [[HCDCustomr alloc]init]
HCDOrder *customer1Order1 = [customer1 pushOrderWithString:@"顾客二要二十串鸡肉" type:orderTypeChicken]
HCDOrder *customer1Order2 = [customer1 pushOrderWithString:@"顾客二要二十串鸭肉" type:orderTypeDuck]
[waiter addOrder:customer1Order1]
[waiter addOrder:customer1Order2]
//顾客取消Order
[waiter deleteOrder:customer1Order2]
//waiter发送order,背后有一个HCDWorker这个单列作为行为实现者来处理具体的order。命令接收完毕,开始发送命令。
[waiter notifyOrder]
}
@end