Skip to content

Latest commit

 

History

History
159 lines (102 loc) · 3.86 KB

桥接模式.md

File metadata and controls

159 lines (102 loc) · 3.86 KB

桥接模式

桥接模式(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:@"桥接模式测试"];