SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

デザインパターンの使い方

デザインパターンの使い方: Adapter

Adapterパターンについて

  • X ポスト
  • このエントリーをはてなブックマークに追加

クライアントアプリケーションで使用できるクラスへの「変換」

public class JimBobStockExchange implements StockLookupService {
   @Override
   public int currentPrice(String symbol) {
      // Jim Bob's real lookup code
      // goes here...
   }
}

 このJimBobStockExchangeクラスはStockLookupServiceインターフェイスを実装しているため、currentPriceメソッドを提供します。この場合、ポートフォリオアプリケーションを作成するのは非常に簡単です。クライアントはPortfolioのインスタンス化に先立ってJimBobStockExchangeのインスタンスを作成するだけで済みます。

   StockLookupService service = new JimBobStockExchange();
   Portfolio portfolio = new Portfolio(service);

 しかし、そんなに都合よく事が運ぶことはめったにありません。多くの場合、ベンダはインターフェイスを提供せず、次のような形になっています。

public class JimBobStockExchange {
   public int currentPrice(String symbol) {
      // Jim Bob's real lookup code
      // goes here...
   }
}

 最も簡単な解決策は、JimBobStockExchangeのサブクラスを作成し、そこでStockLookupServiceインターフェイスを実装することです。

public class JimBobStockExchangeAdapter
      extends JimBobStockExchange
      implements StockLookupService {
   @Override
   public int currentPrice(String symbol) {
      return super.currentPrice(symbol);
   }
}

 このJimBobStockExchangeAdapterクラスは、JimBobStockExchangeクラスのパブリックインターフェイスを、クライアントアプリケーションで使用できるインターフェイスへと「変換」します。これにより、次のように書くことが可能になります。

   StockLookupService service = new JimBobStockExchangeAdapter();
   Portfolio portfolio = new Portfolio(service);

 この変換アダプターのようなしくみをAdapterパターンと呼びます。これはAdapterパターンのごく単純な例です。

 場合によっては、もう少し手間がかかることもあります。ベンダがJavaインターフェイスを提供するとしても、それが望みどおりのものだとは限りません。たとえば、サンプルのポートフォリオアプリケーションで、もう1つAntarcticanStockServiceというルックアップサービスをサポートする必要があると仮定しましょう。

import java.math.*;
import java.util.*;

public class AntarcticanStockService implements StockService {
   @Override
   public BigDecimal price(List<String> symbols) {
      // really cold code here
   }
}

 このサービスには常にシンボルのリストを渡す必要があります。また、このサービスは現在の価格をintではなくBigDecimalとして返します。このインターフェイスの「変換」は、1行の委譲では実現できません。

 リスト3に、これを実現するアダプタークラスの具体的なコードを示します。この2番目の例では、継承ではなく委譲をベースにしています。

リスト3 AntarcticanStockServiceAdapterクラス
import java.math.*;
import java.util.*;

public class AntarcticanStockServiceAdapter
   implements StockLookupService {
   private AntarcticanStockService service =
      new AntarcticanStockService();

   @Override
   public int currentPrice(String symbol) {
      List<String> symbols = Collections.singletonList(symbol);
      BigDecimal price = service.price(symbols);
      return price.intValue();
   }
}

 この例でも、アダプタークラスを作成することで、クライアントアプリケーションのコードを単純化できます。

   AntarcticanStockServiceAdapter service =
      new AntarcticanStockServiceAdapter();
   Portfolio portfolio = new Portfolio(service);
図1 Adapterパターン
図1 Adapterパターン

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
デザインパターンの使い方連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Jeff Langr(Jeff Langr)

本格的なソフトウェアの開発に四半世紀以上携わってきたベテランのソフトウェア開発者。『Agile Java: Crafting Code With Test-Driven Development』(Prentice Hall、2005年)と、他の1冊の著書がある。『Clean Code』(Uncle Bob Martin著、Prentice Hall、2008年8月)にも寄稿している。また、ソフトウェア開発に関する記事を80件以上執筆しており、そのうちの...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2817 2008/08/22 15:54

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング