「こんにちは、アミーゴ! 今日は、«アダプター»とは正確に何なのかを説明します。このトピックについて学習した後、入出力ストリームについての理解がさらに深まることを願っています。」

アダプター - 1

あなたのプログラムが他のプログラマ/会社によって書かれた 2 つのフレームワークを使用していると想像してください。どちらのフレームワークも非常に優れており、OOP 原則 (抽象化、ポリモーフィズム、カプセル化) を使用しています。これらを組み合わせると、プログラムが実行する必要がある内容がほぼ完全にカバーされます。あとは簡単なタスクだけが残ります。1 つのフレームワークで作成されたオブジェクトを他のフレームワークに渡す必要があります。しかし、両方のフレームワークは完全に異なり、「お互いのことを知りません」、つまり、共通のクラスがありません。何らかの方法で、あるフレームワークのオブジェクトを別のフレームワークのオブジェクトに変換する必要があります。

このタスクは、「アダプター」テクニック (デザイン パターン)を適用することで見事に解決できます。

Javaコード 説明
class MyClass implements Interface2
{
 private Interface1 object;
 MyClass(Interface1 object)
 {
  this.object = object;
 }
// This is where we put the Interface2 methods 
// that call Interface1 methods
}
これはアダプターの設計パターンを反映しています。

基本的な考え方は、MyClass クラスが 1 つのインターフェイスを別のインターフェイスに変換 (適応) するということです。

「もっと具体的な例を教えてもらえますか?」

「OK。各フレームワークに独自の「リスト」インターフェースがあるとしましょう。それらは次のようになります。」

Javaコード 説明
interface AlphaList
{
 void add(int value);
 void insert(int index, int value);
 int get(int index);
 void set(int index, int value);
 int count();
 void remove(int index);
}
最初の ( Alpha ) フレームワークのコード

AlphaList は、フレームワーク コードがフレームワークを使用するコードと対話できるようにするインターフェイスの 1 つです。

class AlphaListManager
{
 public static AlphaList createList()
 {
  //some code to create an object
 }
}
AlphaList Manager AlphaListManager はフレームワーク内のクラスです。その createList メソッドはAlphaListオブジェクト
interface BetaList
{
 int getValue(int index);
 void setValue(int index, int value);
 int getSize();
 void setSize(int newSize);
}
class BetaSaveManager
{
 public static void saveList(BetaList list)
 {
  //some code to save a BetaList object
  //to a file on disk
 }
}
2 番目 (ベータ版) フレームワークのコード。

BetaList は、フレームワーク コードがフレームワークを使用するコードと対話できるようにするインターフェイスの 1 つです。

BetaSaveManager はフレームワーク内のクラスです。そのsaveListメソッドはBetaListオブジェクト

class ListAdapter implements BetaList
{
 private AlphaList list;
 ListAdapter(AlphaList list)
 {
  this.list = list;
 }

 int getValue(int index)
 {
  return this.list.get(index);
 }

 void setValue(int index, int value)
 {
  this.list.set(index, value);
 }

 int getSize()
 {
  return this.list.count();
 }

 void setSize(int newSize)
 {
  if (newSize > this.list.count()
  {
   while (this.list.count() < newSize)
  {
   this.list.add(null);
  }
 }
 else if (newSize < this.list.count() {
   while (this.list.count() > newSize)
   {
    list.remove(list.count() - 1);
   }
  }
 }
}
AlphaListインターフェースからBetaListインターフェースに変換する «Adapter» クラス

ListAdapterクラスは、2番目のフレームワークからBetaListインターフェイスを実装します。

誰かがこれらのメソッドを呼び出すと、クラス コードは呼び出しをリスト変数 (最初のフレームワークのAlphaList)に「転送」します。

AlphaListオブジェクトがListAdapterコンストラクターに渡されます。

setSizeメソッド、次のルールに従って動作します。リストのサイズを増やす必要がある場合は、空 (NULL) の項目を追加します。リストのサイズを減らす必要がある場合は、末尾の項目を削除します。

public static void main(String[] args)
{
 AlphaList listAlpha = AlphaListManager.createList();
 BetaList listBeta = new ListAdapter(listAlpha);
 BetaSaveManager.saveList(listBeta);
}
使用例

「あなたの最後の例が何よりも気に入りました。非常に簡潔で分かりやすかったです。」