桥接模式(Simple Factory Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
- 抽象类(Abstraction):抽象类维护一个实现部分的对象的引用,并声明调用实现部分的对象的接口。
- 扩展抽象类(RefinedAbstraction):扩展抽象类定义跟实际业务相关的方法。
- 实现类接口(Implementor):实现类接口定义实现部分的接口。
- 具体实现类(ConcreteImplementor):具体实现类具体实现类是实现实现类接口的对象
假设要实现一个给客户发送提示消息的功能,发送的消息类型可分为:普通消息、加急消息、特加急消息等等,而每种消息的发送的方式一般有:系统内推送、手机短信、电子邮件等等
有一部分人可能会这样设计
- 普通消息
- 系统内推送
- 手机短信
- 电子邮件
- 加急消息
- 系统内推送
- 手机短信
- 电子邮件
- 特加急消息
- 系统内推送
- 手机短信
- 电子邮件
这样的设计确实可以实现上面的需求。但是设想一下,假设我们再来增加一个定时消息呢,我们需要继续创建一个定时消息类,然后在重写系统内推送、手机短信、电子邮件。如果继续增加的话,会写很多重复的东西。
对于这样的场景,其实我们就可以使用桥接模式。
根据上面提到的桥接模式的成员:
- 抽象类就是
消息的抽象类 - 扩展抽象类就是继承
消息抽象类的子类:各种消息 - 实现接口就是发送方式接口
- 具体实现类就是继承发送方式类:系统内推送、手机短信、电子邮件
1、消息类型抽象类
#import <Foundation/Foundation.h>
#import "messageImplement.h"
NS_ASSUME_NONNULL_BEGIN
@interface abstractMessage : NSObject
@property(strong,nonatomic)id<messageImplement> messageIm;
//初始化
- (instancetype)initWithImplement:(id<messageImplement>)implement;
//发送消息
- (void)send:(NSString*)message;
@end
NS_ASSUME_NONNULL_END
------------------------------------
@implementation abstractMessage
- (instancetype)initWithImplement:(id<messageImplement>)implement
{
self = [super init];
if (self) {
self.messageIm = implement;
}
return self;
}
//发送消息
- (void)send:(NSString*)message{
}
@end
2、具体消息类型
我这里就简单的展示一下普通消息,普通消息继承自抽象消息,实现抽象消息的send方法
#import "abstractMessage.h"
@interface commonMessage : abstractMessage
@end
-----------------
#import "commonMessage.h"
@implementation commonMessage
//发送消息
- (void)send:(NSString*)message{
NSString *msg = [NSString stringWithFormat:@"普通消息:%@",message];
[self.messageIm sendMessage:msg];
}
@end
3、消息发送接口
#import <Foundation/Foundation.h>
@protocol messageImplement <NSObject>
-(void)sendMessage:(NSString *)message;
@end
4、具体的消息发送方式
具体发送消息的方式有系统内推送、手机短信、电子邮件三种方式,我们这里就使用电子邮件发送,其他两种方式类似
#import "messageImplement.h"
@interface messageEmail : NSObject<messageImplement>
@end
------------------------
#import "messageEmail.h"
@implementation messageEmail
-(void)sendMessage:(NSString *)message{
NSLog(@"使用Email方式发送消息,消息内容:%@", message);
}
@end
5、客户端调用
对于客户端调用,我们就实现一个使用邮件发送普通消息
messageEmail *email = [messageEmail new];
abstractMessage *msg = [[commonMessage alloc]initWithImplement:email];
[msg send:@"桥接模式测试"];
