アダプタモード--Adaptorパターン

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/ldc9001/article/details/100773195

アダプタモード(アダプタパターン):所望の別のインタフェースへのクライアントインタフェースは、互換性のないインターフェースのこれらのクラスは、一緒に動作することができるエイリアスラッパー(ラッパー)。アダプタモードは、いずれかの構造モデルタイプとして、オブジェクト構造スキーマとして使用することができます。

アダプタモードでは、インターフェイスは一緒にクラスの仕事とは何の関係もなかった新しいアダプタクラスを追加することによって、問題を解決するために、私たちとの互換性はありません。アダプタおよびアダプタのクラスのクラス間の関係に応じてアダプタモードオブジェクトアダプタとアダプタクラスの2種類に分けることができる対応関係によってアダプタとアダプタとの間に、オブジェクト・アダプタ・モードでは、;クラスアダプタモードでは、アダプタとフィッタの間に継承された(または実現)実際の開発関係、より高い周波数のオブジェクトアダプタれます。

オブジェクトアダプタモード
オブジェクトアダプタモード

オブジェクトアダプタパターン構成図は、以下のいくつかの役割が含まれています
ターゲット●(抽象クラスを標的とする)抽象クラスは、特定の所望の顧客インターフェースを定義する、またはインタフェースが抽象クラスで、クラスはコンクリートであってもよいです。
●アダプタ(アダプタクラス):アダプタが継承と関連するターゲットオブジェクトを介してAdapteeを可能Adapteeおよびターゲット、オブジェクトアダプタコアアダプタモードアダプタクラスを適応させるためのコンバータとして、別のインターフェイスを呼び出すことができます両方の接触を持っています。
●Adaptee(カテゴリー別適応):。フィッタすなわち適応役割、既存のインタフェースを定義する必要このインタフェースアダプタ、フィッタクラスは、一般的に具象クラスでは、顧客が使用したい含まれていいくつかのケースでは、ビジネス方法は、クラスのソースコードによって適合されなくてもよいです。

典型的なアダプタオブジェクトコード次のように

class Adapter extends Target {
    
    private Adaptee adaptee; //维持一个对适配者对象的引用
    
    public Adapter(Adaptee adaptee) {
        this.adaptee=adaptee;
    }
    
    public void request() {
        adaptee.specificRequest(); //转发调用
    }
}

クラスアダプタオブジェクトアダプタモードとモードの最大差は、アダプタとの間の関係であり、フィッタはオブジェクトアダプタパターンは、アダプタとアダプタの間にある関係クラスアダプタモードアダプタとによって適合されている継承

アダプタモードクラスの概略構成図
アダプタクラスの構造図

典型的なアダプタクラスのコードは次のよう:
 

class Adapter extends Adaptee implements Target {
    public void request() {
        specificRequest();
    }
}

物体の使用中のアダプタは、クラスがターゲットクラスへの参照を含み、フィッタ場合、適応はアダプターによって呼び出されるクラスのメソッドをターゲットにすることができ、ターゲットクラスは、そのクラスフィッタを通じて呼び出すことができますこの方法は、その後、アダプターは、双方向のアダプタ

双方向アダプタの構造図

より複雑な双方向アダプタ、次のように一般的なコードのように:

class Adapter implements Target,Adaptee {
//同时维持对抽象目标类和适配者的引用
    private Target target;
    private Adaptee adaptee;
    
    public Adapter(Target target) {
        this.target = target;
    }
    
    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }
    
    public void request() {
        adaptee.specificRequest();
    }

    public void specificRequest() {
        target.request();
    }
}

缺省适配器模式(Default Adapter Pattern):当不需要实现一个接口所提供的所有方法时,可先设计一个抽象类实现该接口,并为接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可以选择性地覆盖父类的某些方法来实现需求,它适用于不想使用一个接口中的所有方法的情况,又称为单接口适配器模式。

缺省适配器模式结构图

缺省适配器模式中,包含如下三个角色
● ServiceInterface(适配者接口):它是一个接口,通常在该接口中声明了大量的方法。
● AbstractServiceClass(缺省适配器类):它是缺省适配器模式的核心类,使用空方法的形式实现了在ServiceInterface接口中声明的方法。通常将它定义为抽象类,因为对它进行实例化没有任何意义。
● ConcreteServiceClass(具体业务类):它是缺省适配器类的子类,在没有引入适配器之前,它需要实现适配者接口,因此需要实现在适配者接口中定义的所有方法,而对于一些无须使用的方法也不得不提供空实现。在有了缺省适配器之后,可以直接继承该适配器类,根据需要有选择性地覆盖在适配器类中定义的方法。

 

适配器模式总结

1. 主要优点
无论是对象适配器模式还是类适配器模式都具有如下优点:
(1) 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构。
(2) 增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用。
(3) 灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”。
具体来说,类适配器模式还有如下优点:
由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强。
对象适配器模式还有如下优点:
(1) 一个对象适配器可以把多个不同的适配者适配到同一个目标;
(2) 可以适配一个适配者的子类,由于适配器和适配者之间是关联关系,根据“里氏代换原则”,适配者的子类也可通过该适配器进行适配。


1.主な欠点は
、次のような欠点クラスAdapterパターン:
(1)Javaのため、C#は、複数のクラスの継承と他の言語をサポートしていない、一つのみよりフィッタ収まらない、フィッタクラスに適合することができ;
( ; 2)フィッタタイプJavaでfinalクラスすることができないように、最終的なクラスにすることはできません、C#の封止されていることができないクラス
(3)は、Java、C#、および他の言語、クラスアダプタモードターゲット抽象クラスのみインターフェースでクラスとして、その使用は、いくつかの制限がありません。
以下のような欠点オブジェクトアダプタモード:
モデルベースのアダプタと比べて、いくつかの方法フィッタクラスが面倒アダプタに交換することができます。私たちがフィッタ以上の方法のうちの1つのクラスを交換する必要がある場合は、サブクラスフィッタクラス、クラスメソッドアウトフィッタの交換を行うことができ、その後、本物のようフィッタクラスのサブクラスを置きます適応によって適応は、実装プロセスはより複雑です。

1.アプリケーション・シナリオ
次の場合にアダプタモードと考えることができる:
(1)システムは、既存のクラスのいくつかを使用する必要があり、これらのクラス及びインターフェース(例えば、メソッド名)は、これらのクラスのためれていないソースコード、システムのニーズを満たしていません。
将来的に導入することができるいくつかのクラスを含む相互にあまり相関が、(2)クラスの一部を操作するための再利用可能なクラスを作成したいと考えていません。

 

 

 

おすすめ

転載: blog.csdn.net/ldc9001/article/details/100773195