Любому объекту вы можете присваивать в делегат любой другой объект, это не нарушает ни какие другие паттерны и т.п.
//файл A.h
@protocol ADelegate <NSObject>
- (void)aDelegateMethod;
@end
@interface A : NSObject
@property (nonatomic, weak) id<ADelegate> delegate;
/*
Описывая делегат таким образом мы скрываем объект за протоколом ADelegate.
В вашем случае модель не будет знать что у неё делегат это контроллер, модель будет
думать что там есть некий объект который отвечает на ADelegate протокол и кто там конкретно не важно
*/
@end
//файл B.h
#import "A.h"
@interface B : NSObject <ADelegate>
@end
//файл B.m
@implementation B
- (void)foo
{
A *a = [A new];
a.delegate = self;
}
#pragma mark - ADelegate Protocol
- (void)aDelegateMethod
{
}
@end