乐趣区

关于设计模式:设计模式第六篇来康康适配器模式

一 引言

设计模式就是一种思维,一种设计形式,他能够帮忙咱们对于一些问题(不肯定是技术,如生存中的问题)的解决提供一些思路,以及问题解决方案的建模与形容

例如咱们明天要讲的适配器模式就是从解决生存问题,过渡到了技术层面的问题

现实生活中,经常会呈现两者不能兼容的一种状况,例如出国了,咱们从国内带的充电插头与外国的插孔就不匹配,再例如我去香港旅游,然而又不会讲粤语,在一些小一些的商店买货色,就须要一个会讲粤语的敌人帮我在两头翻译

换到技术层面中,咱们开发某些业务的局部组件曾经在库中存在了,然而因为过来开发组件时与以后接口标准不兼容,应用适配器模式,也就是找一个两头量,帮忙咱们适配两者,对接起来,这样就不必再开发一个新的组件了

二 代码演示

例子背景是这样的,咱们当初有一台苹果手机(Lightning 接口),然而咱们当初只有一根 Type-C 的充电线,咱们须要想方法,减少一个两头的转接器,从而能达到给手机充电的成果

(一) 类适配器(继承,不罕用)

(1) 演示

尽管这一种不罕用,然而第二种就是在第一种根底上改良的,内容不是很多,能够急躁看完喔

首先,定义一个苹果手机类,其中有一个充电的办法(Converter 在前面有说,接着往下看)

/**
 * 客户端类:苹果手机想充电,然而充电线的头是 Type-C 的
 */
public class Phone {
    // 充电办法
    public void charging(Converter converter){converter.TypeCToLightning();
    }
}

接着定义的就是 Type-C 这条充电线,因为它是没方法插入苹果手机的 Lightning 接口 的,所以它就是被适配的类

/**
 * 被适配的类:Type- C 充电线
 */
public class TypeCLine {public void charging(){System.out.println("开始充电了");
    }
}

两个不能间接分割的内容,咱们曾经定义好了,即手机和 Type-C 充电线,当初就差一个两头的适配器了,当初能够定义一个转换的接口,其中定义一个 Type-C 转为 Lightning 的办法

/**
 * 充电器转换接口
 */
public interface Converter {
    // Type-C 转为 苹果 Lightning 接口
    void TypeCToLightning();}

接下来就是一个具体的实现类了,实现形象接口没什么好说的,还有一步是要害——继承充电线这个须要被适配的类,至于它的利弊咱们上面再说

/**
 * Type-C 充电线转化器
 */
public class TypeCLineAdapter extends TypeCLine implements Converter {
    @Override
    public void TypeCToLightning() {
        // 转接胜利,能够应用通过转接后的 type-C 的线充苹果手机了
        super.charging();}
}

测试一下

public class Test {public static void main(String[] args) {Phone phone = new Phone(); // 手机
        TypeCLine typeCLine = new TypeCLine(); // Type- C 充电线
        Converter typeCLineAdapter = new TypeCLineAdapter(); // Type- C 充电线转接器
        // 手机间接引入转接器从而充电
        phone.charging(typeCLineAdapter);
    }
}

后果:开始充电了

(2) 利弊

测试代码中,大家应该也能看进去了 typeCLine 如同并没有被用到,的确如此,因为咱们在适配器类,即 TypeCLineAdapter 类中,是通过间接继承 TypeCLine 这个 Type-C 充电线类的,也就是说,它的理念是通过多重继承来实现两个接口之间进行匹配,然而像 C#,VB.NET,Java 等语言都是不反对多继承的,而且其应用了继承,继承在管制不失当的状况下总会给咱们带来一些麻烦,所以在这里也并不是很适合,所以就有了上面的形式

(二) 对象适配器(组合,罕用)

(1) 演示

手机和 Type-C 充电线这是不变的,须要做的就是批改具体的适配器类 TypeCLineAdapter,咱们这里创立一个新的 TypeCLineAdapter2

/**
 * Type-C 充电线转化器
 */
public class TypeCLineAdapter2 implements Converter {

    private TypeCLine typeCLine;

    public TypeCLineAdapter2(TypeCLine typeCLine) {this.typeCLine = typeCLine;}

    @Override
    public void TypeCToLightning() {
        // 转接胜利,能够应用通过转接后的 type-C 的线充苹果手机了
        typeCLine.charging();}
}

测试一下:

public class Test {public static void main(String[] args) {Phone phone = new Phone(); // 手机
        TypeCLine typeCLine = new TypeCLine(); // Type- C 充电线
        Converter typeCLineAdapter2 = new TypeCLineAdapter2(typeCLine); // Type- C 充电线转接器
        // 手机间接引入转接器从而充电
        phone.charging(typeCLineAdapter2);
    }
}

(2) 利弊

在 TypeCLineAdapter2 的步骤中,首先咱们勾销了适配器继承 TypeCLine 类,而是抉择通过在适配器 TypeCLineAdapter2 这个类 中减少一个 TypeCLine 的公有域,而后再在办法中调用

首先,咱们解脱了单继承带来的懊恼,那么这样做还有什么益处吗

在《Effecttive Java》一书中,第 4 章 第 18 条:复合优先于继承中有提到,有一个比拟好的说法,我简略摘了一下:

咱们能够创立一个新的类(适配器 TypeCLineAdapter2 类),在新的类中增加一个公有域(TypeCLine 类),他援用现有类的一个实例,这种设计叫做复合

  • 因而现有的类变成了新类的一个组件,新类中的每个实例办法都能够调用被蕴含的现有的类中对应的办法,并返回他的后果,这就是转发,而新类中的办法被称为 转发办法

小结:这种形式下,测试的时候感觉也会更难受,和咱们想的个别,手机和 Type-C 的线,别离通过链接适配器,就达到了能适配充电的形式,同样又防止了应用继承,算是一种比拟好的适配问题解决形式

三 适配器模式实践

(一) 定义和分类

适配器模式(Adapter)定义:将一个类的接口转换成客户心愿的另外一个接口,使得本来因为接口不兼容而不能一起工作的那些类能一起工作

分类:

  • 类适配器模式

    • 次要应用继承实现,耦合度高,且在单继承的语言中应用会受限,还须要避免继承带来的一些问题
  • 对象适配器模式

    • 应用了组合(或叫复合)的形式升高了耦合,举荐应用

(二) 构造

① 类适配器模式

② 对象适配器模式

还是仍旧剖析一下其中的角色:

适配者(Adaptee)类 :它是须要被适配的类,例如下面提到的 Type-C 线,适配后能力插入到苹果手机中充电

指标(Target)接口 :以后零碎业务所期待的接口,它能够是抽象类或接口,对应代码中的 Converter 接口,他是客户期待的适配转换接口

适配器(Adapter)类 :它是一个转换器,通过继承或援用适配者的对象,把适配者接口转换成指标接口,让客户按指标接口的格局拜访适配者

退出移动版