美文网首页
适配器模式(Adepter Pattern)

适配器模式(Adepter Pattern)

作者: iOS_学渣 | 来源:发表于2019-11-30 14:31 被阅读0次

    适配器模式:将一个类的接口转换成客户期望的接口。适配器让原本可以不兼容的类可以适配无期
    适配器模式是结构型模式的一种,即通过改变某个已有类的接口实现,来适配客户相关逻辑和已有代码不兼容的逻辑

    我们经常用的电脑大部分都是2口的插头,如果一个环境下只有3口的插座,咋办?
    这个时候用一个3口的适配器插头套上2头的就好了,同样在代码逻辑中,如果客户期望的接口和我们自己提供的接口不匹配怎么办,通过适配器来伪装一个期望的接口就完事了。

    整体上来讲适配器模式很简单,不更多赘言

    适配器模式

    这里提到的适配器都是对象适配器,还有一种适配器叫类适配器,需要用到多继承。iOS/Android(java)都不支持多继承。
    类适配器通过多继承,让适配器同时具备被适配对象和适配对象的能力。然后在让被适配对象可以响应适配对象的请求。

    类适配器

    当然在iOS中可以变通,通过协议和继承,让Adapper同时具有协议方法和被适配的方法。然后调用super;在Android/Java中通过继承和接口也能实现类似的逻辑

    iOS中的类适配器

    举个栗子
    家里养了几只家鸭,最近抓了几只野鸡。
    本来鸭子和野鸡不会在一起的,但是主人粗心关在了一起。
    现在也需要野鸡叫。
    很显然,鸭叫和野鸡叫的方法并不相同。
    调用鸭子和野鸡叫的方法已经实现了。
    并且不能修改怎么办?

    很简单,把野鸡伪装成家鸭即可。

    鸭类的协议

    #import <Foundation/Foundation.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @protocol Durk <NSObject>
    
    -(void)quack;
    
    @end
    
    NS_ASSUME_NONNULL_END
    

    鸭类的实现

    #import "HomeDurk.h"
    
    @implementation HomeDurk
    
    - (void)quack {
        NSLog(@"嘎嘎嘎!!!");
    }
    
    @end
    
    

    野鸡的协议

    #import <Foundation/Foundation.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @protocol Turkey <NSObject>
    
    -(void)gobble;
    
    @end
    
    NS_ASSUME_NONNULL_END
    

    野鸡的实现

    #import "WilrdTurkey.h"
    
    @implementation WilrdTurkey
    
    - (void)gobble {
        
        NSLog(@"咕咕咕!!!");
    }
    
    @end
    
    

    (野鸡)的鸭适配器 实现鸭的协议

    #import "DurkAdapter.h"
    
    @interface DurkAdapter()
    
    @property (nonatomic ,assign)id <Turkey> turkey;
    
    @end
    
    @implementation DurkAdapter
    
    -(instancetype)initWithTurkey:(id<Turkey>)turkey {
        if (self = [super init]) {
            
            _turkey = turkey;
        }return self;
    }
    
    -(void)quack {
        
        [_turkey gobble];
    }
    
    @end
    
    

    让我们来听鸭叫吧

    #import <Foundation/Foundation.h>
    #import "Durk.h"
    #import "Turkey.h"
    #import "DurkAdapter.h"
    #import "WilrdTurkey.h"
    #import "HomeDurk.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            // insert code here...
            NSLog(@"Hello, World!");
            HomeDurk * durk = [[HomeDurk alloc] init];
            [durk quack];
            
            //适配了鸭的火鸡(让火鸡冒充鸭),可以调用鸭的方法
            WilrdTurkey * turkey = [[WilrdTurkey alloc] init];
            id<Durk> turkeyDurk = [[DurkAdapter alloc]initWithTurkey:turkey];
            [turkeyDurk quack]; 
        }
        return 0;
    }
    
    

    优点

    1.解决不兼容的问题
    2.提高了类的复用性

    缺点

    过多的使用适配器让系统理解难度加大。

    相关文章

      网友评论

          本文标题:适配器模式(Adepter Pattern)

          本文链接:https://www.haomeiwen.com/subject/nljowctx.html