kurodakazumichi / issues

0 stars 0 forks source link

【デザインパターン】Adapter #32

Open kurodakazumichi opened 6 years ago

kurodakazumichi commented 6 years ago

Adapter WIkiを見ながら理解していくターン

Adapter パターン

効果・効能

Adapter パターンを用いると、既存のクラスに対して修正を加えることなく、インタフェースを変更することができる。

なんか既存クラスを拡張できるような感じがしてくるが、実際はそうじゃない。 新しいクラスを作ってそのクラスで元のクラスの機能を利用するだけである。

方法

Adapter パターンを実現するための手法として継承を利用した手法と委譲を利用した手法が存在する。

kurodakazumichi commented 6 years ago

継承パターン

interface ProductPrice{
  public int getPrice();
}

class Product{
  private int cost;
  public int getCost(){
    return cost;
  }
}

class ProductAdapter extends Product implements ProductPrice{
  public int getPrice(){
    return this.getCost();
  }
}

500px-adapter_using_inheritance_uml_class_diagram svg

kurodakazumichi commented 6 years ago

委譲パターン

interface ProductPrice{
  public int getPrice();
}

class Product{
  private int cost;
  public int getCost(){
    return cost;
  }
}

class ProductAdapter implements ProductPrice{
  private Product product = new Product();
  public int getPrice(){
    return product.getCost();
  }
}

500px-adapter_using_delegation_uml_class_diagram svg

kurodakazumichi commented 6 years ago

使いどころを考える

イメージ

computer_adapter

要するとこれだ。 Adapter = 適合させるもの

一般家庭のコンセントとゲーム機をつなげるには 専用のアダプターが必要になる。

このアダプターは一般的なコンセントの形(インターフェース)と 一般的でないゲームの電源差すところの形を適合させている。

ゲームの電源差すところ自体は一切変更せずに 一般のコンセントに繋げるようにインターフェースが変更されるわけだ。

kurodakazumichi commented 6 years ago

つまりは初めから既存のインターフェースに合わせておけば アダプターなんて不要なわけだ。

でもそれができず、さらに既存のものにも手を加えられない という状況になったときに使えるのがこのアダプターパターン。

自分が作ったプログラムで使う事があるとすれば 設計ミスったけどもう後戻りできないので苦し紛れの選択として使うか フレームワークなど、基本変更できないプログラムと自分のプログラムを適合させる場合 という感じだろうか

kurodakazumichi commented 6 years ago

言語による使い勝手

継承パターンの場合 C++にはinterfaceという機能がないので、同様の事をするためには 多重継承や抽象クラスなどを用いなければならない

逆にinterfaceが使える言語で、あるinterfaceに合わせたいという場面だと 非常に使い勝手のいいパターンと思われる。

多重継承も使いようによってはinterfaceと同じような振る舞いになるが あまり使いたいとは思えない。