swift 之设计模式 适配器

大学的时候,有一个《近世代数》的教授,他上课从来不看课本,并且也不按课本来讲解课程,但是他讲的东西比书本深刻形象(幽默,口才杠杠的),有层次感,除了授业,他还经常给我讲一些为人处世,做学问的方法【他是我尊敬的老师之一】。  学过这门课的人都知道这门课全是理论,群论,环,域等,各种理论证明,各种装逼各种飞。  现在课本上的还回去的基本上还回去了,留下更多的就是他给我讲的一些方法,在这里引入一下:

掌握一个新概念:

1. 背景引入,为什么会有这个概念产生

2. 是什么?拆分概念的各种条件,名词,结论

3. 熟悉相关例子

4. 做题

5. 笔记总结,下次上课不看书,用自己的语言表述这个概念,举个例子【记忆中,每次讲完一张,他就要求我们做读书笔记,画知识图】

今天为什么会谈及上面这些,我觉得像我们做程序员的,学习是必须的,高效的学习东西也是必须的,把东西学到脑子里运用到项目中那也是理所当然的。对于一个新的东西,我们也可以效仿这位老师的一些方法。

我个人比较推崇: from(背景/problem) --  what  --- where/when(产生的时机/examples) ----  how(思路)  ---- do(上代码)  -- summary(总结)

废话不多说,上菜:

适配器:

from:

生活:对于这个概念,我头一想到的就是充电器,我们都知道我们国家的是220v的标准电压,日本的100v, 美国的又是不一样,那么我们有一个手机,如果要到这三个地方旅游,那么我带一个充电器是不是在其他国家就用不了。没到不同的国家我们的充电器就要换个。当然你说苹果的就不用,它的是万能充电器,全球都适用。

项目: 在项目中,我们也会有这种问题,比如你有个自定义view,然后你在controller要给这个view传递数据给他,我们经常会这样做:

1. 直接给view上的控件赋值

2. 把view需要的数据抽象成一个对象,然后传这个对象给view。

这两种方法都可行,but,都存在一些问题:

对于1,直接赋值,如果view复杂起来是不是都要写很多这样的代码,如果某一天换了个字段,是不是每个地方都要进行改动,这种的代码耦合度太高,不可取。

对于2,这种方法我现在都还在使用,之前我也不知道这种方法到底有什么缺点,但是当有一天我碰到有两个数据模型都可以给view进行赋值,但是我在view上只进行了对其中一个模型的绑定,这个时候我是不是要在view上再添加一个另一个模型的绑定方法,对于这种写法,我个人感觉很别扭,所以就有代码灵活性的问题。

what:

那什么是适配器呢?

适配器设计模式是一种结构型设计模式, 它的作用是把一个类的接口转换成客户希望的另外一个接口,从而使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

结构型设计模式:

在解决了对象的创建问题之后,对象的组成以及对象之间的依赖关系就成了开发人员关注的焦点,因为如何设计对象的结构、继承和依赖关系会影响到后续程序的维护性、代码的健壮性、耦合性等。对象结构的设计很容易体现出设计人员水平的高低,这里有7个具体的结构型模式可供研究,它们分别是:

外观模式(Facade)

适配器模式(Adapter)

代理模式(Proxy)

装饰模式(Decorator)

桥模式(Bridge)

组合模式(Composite)

享元模式(Flyweight)

我们现在所说的设计模式是 Gof 下的 Behavioral | Creational | Structural 的Structural

In software engineering, structural design patterns are design patterns that ease the design by identifying a simple way to realize relationships between entities.

Source: wikipedia.org

适配器有两种实现方式:

1. 类适配器

Adapter 类既继承了 Adaptee (被适配类),也实现了 Target 接口

2. 对象适配器

另外一种适配器模式是对象适配器,它不是使用多继承或继承再实现的方式,而是使用直接关联,或者称为委托的方式

where/when:

希望复用一些现存的类,但是接口又与复用环境要求不一致的情况,就拿我上面的问题 ,或者在 遗留代码复用、类库迁移 等方面。

适用场景:

1、已经存在的类的接口不符合我们的需求;

2、创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作;

3、在不对每一个都进行子类化以匹配它们的接口的情况下,使用一些已经存在的子类。

how:

思路其实就如2上的两张UML,这里不做简述了

do:

import UIKit

protocol AnimingProtocol {
    var angleV: NSNumber { get }
    var angleH: NSNumber { get }
}

// Adaptee
struct AdapteeTarget {
    let angleHorizontal: Double
    let angleVertical: Double
    init(angleHorizontal: Double, angleVertical: Double) {
        self.angleHorizontal = angleHorizontal
        self.angleVertical = angleVertical
    }
}

// Adapter
struct AdapterTarget: AnimingProtocol {
    private let target: AdapteeTarget
    var angleV: NSNumber {
        return NSNumber(double: target.angleVertical)
    }
    var angleH: NSNumber {
        return NSNumber(double: target.angleHorizontal)
    }
    init(target: AdapteeTarget) {
        self.target = target
    }
}

summary: 

适配器模式有点如上,其缺点也存在,很多东西本来可以直接了当,用了适配器后就多了一大坨代码。当然如果把上面的实现在拆分下文件,那么显然如果不知道适配器原理的人 就很难理解代码why了。但是对于项目的长远来看,如果可以写出可变性好的代码,偶尔降低代码的可读性 也是可以接受的,毕竟这些模式都很金典,看不懂只能说明学得还不够多。

对于do上代码你认为他是类适配器还是对象适配器?

时间: 2024-08-11 09:47:07

swift 之设计模式 适配器的相关文章

设计模式——适配器

又分为三种: 类的适配器模式: package designpattern.structure.adapter.classadapter; public interface ITarget { public void method1(); public void method2(); } package designpattern.structure.adapter.classadapter; public class Source { public void method1() { Syste

iOS常用设计模式——适配器Adapter

1.什么是适配器设计模式(Adapter)   (What) 适配器设计模式是一种结构型设计模式, 它的作用是把一个类的接口转换成客户希望的另外一个接口,从而使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器设计模式有两种实现方式:1.)通过继承来实现两个接口,叫类适配器: 2.)通过引用来避免对象适配器继承被适配对象,叫对象适配器. 图1: 类适配器的UML图 在类适配器中,Adapter与Adaptee之间的关系是继承,我们通过继承来实现对Adaptee中+ specific

ABAP设计模式——适配器

计算机科学中的大多数问题都可以通过增加一层间接性来解决.  ——David Wheeler 适配器模式(Adapter Design Pattern),是一个广泛应用于真实世界和面向对象编程语言的设计模式.基于面向对象的标准SAP程序中同样很多地使用了适配器模式. 适配器是什么? 适配器把因为不同的“接口”而不兼容的对象转换(为兼容的).通过实现适配器,我们可以让一些原本不能共同工作的类共同工作. 有时,我们有一个客户端,它希望对象只有一个确定的接口.还有一个对象,他能满足功能上的要求,但是两个

iOS设计模式 - 适配器

效果 说明 1. 为了让客户端尽可能的通用,我们使用适配器模式来隔离客户端与外部参数的联系,只让客户端与适配器通信. 2. 本教程实现了适配器模式的类适配器与对象适配器两种模式,各有优缺点. 3. 如果对面向对象基本原理以及设计模式基本原理不熟悉,本教程会变得难以理解. 源码 https://github.com/YouXianMing/AdapterPattern // // BusinessCardView.h // Adapter // // Created by YouXianMing

读书笔记之设计模式-适配器和外观模式

结构型:Adapter与Facade(适配器和外观模式) 一般作为阅读材料,首先想要明确的是我现在了解的设计模式的初衷,即为了解决什么问题. 适配器,如果有买过港版Iphone在内地使用的人应该会有三角大插头必须接一个转换器才能在一般的插座上使用的情况,当然这只是比较直观的感受.其实我们平时用的手机充电器都是属于适配器,试想如果我们没有这个充电器,我们如何利用普通插座给手机充电? 适配器的定义:将手头上所持有的接口转换成我们需要的接口(业务场景:经常是为了适配旧程序或者对接2套系统的时候使用,当

设计模式--适配器(Adapter)模式

今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模式.写到这里,想起很久以前,有写过一篇<ASP.NET的适配器设计模式(Adapter)>http://www.cnblogs.com/insus/archive/2013/02/04/2891426.html ,但是似乎没有适配器的味道. 比如一个系统,开发时设计好各种权限,但某一种,客户提出要求,需要一个特殊的权限来操作.只好开发一个适配器来让其有这个特殊操作权限. 用代码来举例吧. 先定

设计模式适配器

适配器模式 设计原则:遵循开闭原则.体现功能复用常用场景:需要使用一个类的功能,但是该类的接口不符合使用场合要求的接口,可使用定制适配器,又或者是有一个接口定义的行为过多,则可以定义一个缺省适配器,让子类选择性的覆盖适配器的方法使用概率:40%复杂度:中变化点:无选择关键点:定制适配器的选择关键点在于是否有更加优良的替代方案,缺省适配器的选择关键点在于接口中的方法是否可以不全部提供,且都有缺省方案逆鳞:无相关设计模式装饰器模式:对于适配器模式中的定制适配器与装饰器模式,二者都是使用组合加继承的手

设计模式——适配器(Adapter)模式

概述 什么是适配器?在我们生活中的适配器比如插头转换器(中标转美标).USB接口转换器(type-c转苹果),电脑电源适配器(交流电转低电压直流)等.像这种将两者有差异的东西通过适配器使他们成为相互适合的东西.在程序世界中,经常存在现有的程序无法直接使用,需要做适当的变换后才能使用的情况,这种用于填补“现有程序”和“所需程序”之间差异的设计模式就是适配器(Adapter)模式.适配器模式有类适配器模式和对象适配器模式两种,前者使用继承,后者使用组合,所以后者比较灵活,推荐使用.下面通过实例对这两

Java设计模式 —— 适配器(Adapter)

# 标签: 读博客 Adapter Pattern / Wrapper Pattern 什么时候需要适配,需要包装?肯定是你给我的,现有的服务提供的不好用,我才需要给你进行一下包装再用,或者适配之后再用. Android中,数据的list能直接放到view上面么?不能吧,所以搞了个adapter适配一下,变成了一个封装类,这个封装类是可以安在view上,或者说给view提供数据源的. 你笔记本电脑需要12V的直流电,但是你家里只有220V交流电或者110V交流电,所提供的,并不是所需的,不能直接