小鹏的技术博客

求索

Hi,我是小鹏,Java/iOS/Android开发者!


希望在这里记录一些自己对技术的学习和思考,欢迎交流!

设计模式之适配器模式Adapter

1.何为适配器模式(Adapter)

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作(Adapter有助于两个不兼容的接口一起工作)。 简单的说,就是需要的东西就在面前,但却不能使用,而短时间又无法改造它,于是我们就想办法适配它。适配器主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况,比如在需要对早期代码复用一些功能等应用上很有实际价值。

2.如何实现适配器(Objective-C)

Delegate是Objective-C的语言特性,使用它可以定义适配器模式的实例接口。协议本质上是一系列的非关联与类方法声明(等同于Java中的接口Interface)。如果你想让一个对象与其他对象沟通,但对象的接口互不兼容,你可以定义一个协议,然后对象可以通过协议接口将消息发送到其它对象。

注:

Delegate的设计并不完全匹配于适配器模式的描述。但它实现了该模式的目标是:允许类用不兼容的接口一起工作。

实现Adapter模式的思路是:
第一种称为类适配器,主要通过继承和协议实现,首先需要有定义了客户端要使用的一套行为的协议,然后要用具体的适配器类实现这个协议。适配器类同时也要继承被适配者,它们之间的关系如图:


第二种称为对象适配器,与类适配器不同,对象适配器不继承被适配者,而是组合了一个对它的引用。实现为对象适配器时,它们的关系如图:

//  Adapter
//  Target.h

#import <Foundation/Foundation.h>
@interface Target : NSObject

@end

@protocol Target <NSObject>

- (void)request;

@end

#import "Target.h"
@implementation Target

@end



//  Adaptee.h

#import <Foundation/Foundation.h>
@interface Adaptee : NSObject
- (void)specificRequest;
@end

#import "Adaptee.h"
@implementation Adaptee
- (void)specificRequest
{
    NSLog(@"Adaptee specificRequest method invoked!");
}
@end


//  Adapter.h

#import <Foundation/Foundation.h>
#import "Adaptee.h"
#import "Target.h"
@interface Adapter : NSObject <Target>
@property Adaptee *adaptee;
-(void)adapteeRequest;
@end

#import "Adapter.h"
@implementation Adapter
-(void)request
{
    NSLog(@"Target Protocal request method invoked!");
}
-(void)adapteeRequest
{
    _adaptee = [[Adaptee alloc] init];
    [_adaptee specificRequest];
}
@end

3.应用(Cocoa中的Adapter)

待续…

参考:
Adapter_pattern
Cocoa Design Patterns
iOS Design Patterns
Adapter Design Pattern
iOS Design Patterns

最近的文章

iOS核心技术之:内存管理之二手动内存管理

1.关于内存管理应用程序内存管理是:“在程序运行时开辟内存空间、使用内存空间,并在程序完成时释放内存空间的过程”。写得好的程序,会尽可能少占用内存。在Objectiv-C中,内存管理被看做是在很多数据和代码中分配受限内存资源所有权(Ownership)的一种方式。虽然内存管理通常被认为是针对单个对象级别进行的,但实际上我们的任务是管理“对象图”(Object Graph),你需要确保除了你实际需要的对象之外,内存中没有其它的对象。 Objective-C提供了两种内存管理方式: ...…

继续阅读
更早的文章

设计模式之单例模式Singleton

1.何为单例模式(Singleton)保证一个类仅有一个实例,并提供一个访问它的全局访问点。一个全局变量使得一个对象可以被访问,但它不能防止实例化多个对象。一个更好的办法是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。这就是Singleton模式。2.如何实现单例(Objective-C)实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法);当我们调用这...…

继续阅读