横たわるデザインパターンのノート(XIV)のアダプタモード

栗のために

問題の説明

さまざまな国の人々はNBAでプレーするが、彼らは英語でコミュニケーションすることがあります。

単純な実装

プレーヤー

/**
 * 球员
 * Created by callmeDevil on 2019/8/4.
 */
public abstract class Player {

    protected String name;

    public Player(String name){
        this.name = name;
    }

    // 发起进攻
    public abstract void attack();
    // 转回防守
    public abstract void defense();

}

前方に

/**
 * 前锋
 * Created by callmeDevil on 2019/8/4.
 */
public class Forwards extends Player {

    public Forwards(String name){
        super(name);
    }

    @Override
    public void attack() {
        System.out.println(String.format("前锋 %s 进攻", name));
    }

    @Override
    public void defense() {
        System.out.println(String.format("前锋 %s 防守", name));
    }
}

センター

/**
 * 中锋
 * Created by callmeDevil on 2019/8/4.
 */
public class Center extends Player {
    // 代码与前锋相似
}

ガード

/**
 * 后卫
 * Created by callmeDevil on 2019/8/4.
 */
public class Guards extends Player {
    // 代码与前锋相似
}

テスト

public class Test {
    public static void main(String[] args) {
        Player b = new Forwards("巴蒂尔");
        b.attack();
        Player m = new Guards("麦克格雷迪");
        m.attack();

        Player ym = new Center("姚明");
        // 姚明问:attack 和 defense 是什么意思?
        ym.attack();
        ym.defense();
    }
}

テスト結果

前锋 巴蒂尔 进攻
后卫 麦克格雷迪 进攻
中锋 姚明 进攻
中锋 姚明 防守

問題があります

八尾Minggang NBAは英語は非常に良いではない可能性がある場合、つまり、コーチの戦術的な取り決めを理解して添付して防衛するために耳を傾け、それは何を意味するのか分からないので、この実現には問題があるでしょう、あなたは英語での翻訳を必要としています。

アダプタモード

定義

クライアントは別のインターフェイスを期待していたクラスのインタフェースを変換します。Adapterパターンは、そうでないため、互換性のないインタフェースのこれらのクラスが一緒に働くことができない一緒に動作するようになります。

分類

これは、分割されたクラスのアダプタモードオブジェクトアダプタモード以来クラスアダプタパターン別のインターフェイスの試合への1つのインタフェースに複数の継承を通じて、ジャワおよび他の言語がサポートされていない多重継承クラスが一つだけの親を持っているので、ここで主に懸念しているで、オブジェクトアダプタを

UMLダイアグラム

コードの実装

ForeignCenter

/**
 * 外籍中锋
 * Created by callmeDevil on 2019/8/4.
 */
public class ForeignCenter {

    // 外籍中锋球员的姓名故意用属性而不是构造方法来区别与三个球员的不同
    private String name;

    // 表明外籍中锋只懂中文“进攻”(注意:举例效果,实际上千万别用这种方式编程)
    public void 进攻(){
        System.out.println(String.format("外籍中锋 %s 进攻", name));
    }

    // 表明外籍中锋只懂中文“防守”(注意:举例效果,实际上千万别用这种方式编程)
    public void 防守(){
        System.out.println(String.format("外籍中锋 %s 防守", name));
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

翻訳者

/**
 * 翻译者
 * Created by callmeDevil on 2019/8/4.
 */
public class Translator extends Player{

    // 声明并实例化一个内部“外籍中锋”对象,表明翻译者与外籍球员有关联
    private ForeignCenter wjzf = new ForeignCenter();

    public Translator(String name){
        super(name);
        wjzf.setName(name);
    }

    @Override
    public void attack() {
        // 翻译者将“attack”翻译为“进攻”告诉外籍中锋
        wjzf.进攻();
    }

    @Override
    public void defense() {
        // 翻译者将“defense”翻译为“防守”告诉外籍中锋
        wjzf.防守();
    }

}

テスト

public class Test {
    public static void main(String[] args) {
        Player b = new Forwards("巴蒂尔");
        b.attack();
        Player m = new Guards("麦克格雷迪");
        m.attack();

        Player ym = new Translator("姚明");
        // 翻译者告诉姚明,教练要求你既要“进攻”又要“防守”
        ym.attack();
        ym.defense();
    }
}

テスト結果

前锋 巴蒂尔 进攻
后卫 麦克格雷迪 进攻
外籍中锋 姚明 进攻
外籍中锋 姚明 防守

概要

  • データおよびシステムの動作が正しいですが、インターフェイスと一致しない場合、我々はアダプターの使用を検討すべき、目的が一致するインターフェイスのコントロール外に元のオブジェクトを作ることです。
  • アダプタモードは、主に使用されている既存のクラスの一部を再利用したいのですが、インターフェイスやマルチプレックス環境と矛盾します。
  • 既存のクラスを使用するが、それはインターフェースだ場合、それは、その方法であり、あなたの要求は同じではありませんが、あなたはアダプタモードを使用することを検討すべきです。
  • 二つのことは、同一または類似のタイプをやったが、それを使用するために異なるインタフェースを有します。
  • 統一されたクライアントコードはライン上で同じインターフェイスを呼び出すことができますので、あなたはより多くの、シンプル、簡単かつコンパクトなことができます。
  • 時間を変更して、アダプタモードの適応を使用して、両方のは容易ではありませんで。

おすすめ

転載: www.cnblogs.com/call-me-devil/p/11298653.html
おすすめ