search
LoginSignup
46

More than 5 years have passed since last update.

posted at

updated at

Organization

デザインパターン「Adapter」

はじめに

本投稿はJava言語で学ぶデザインパターン入門のデザインパターンをまとめた記事です。今回はSingletonパターンになります。
まとめ一覧はこちら

Adapterパターン

スクリーンショット 2016-02-07 21.12.58.png

Adapterとは

Adapterとは適合するという意味で、Wrapperパターンと呼ばれることもあります。
「すでに提供されているもの」を「利用できるもの」にするためのデザインパターンで、本書ではAC電源とノートパソコンの間のACアダプターを例として説明されています。

利用場面として以下が考えられます

  • 関連性のないクラス通しを既存のクラスを変えずに関連付けする場合
  • 既存のクラスをある新しいインターフェイスを通じて再利用したい場合
  • 既存のクラス・インターフェイスをアプリケーション固有なものに(使いやすく)したい場合

Adapterパターンのクラス図

スクリーンショット 2016-02-07 21.39.16.png

  • 利用する側はAdapterを生成し、Target[インタフェースまたは抽象クラス]を利用する
  • Adapterは継承または委譲を使ってAdapteeを利用する

具体例

今回はプロパティをストリームから読み書きするjava.util.PropertiesクラスをAdapterパターンを使ってFilePropertiesクラスを作っていきます

java.util.Propertiesクラスは以下のメソッドが利用できます


void load(InputStream in) throws IOException

プロパティの集合をInputStreamから読み込む


void store(OutputStream out, String header) throws IOException

プロパティの集合をOutputStreamから書き込む(header: コメント文字列)

Mainクラス

以下のようにfile.txtにプロパティを書き込んでnewfile.txtで保存処理をしていきたいと思います

Main.java
public static void main(String[] args) {
        FileIo fileIo = new FileProperties();//※
        try {
            fileIo.readFromFile("file.txt");
            fileIo.setValue("Apple", "iPhone");
            fileIo.setValue("Google", "Android");
            fileIo.setValue("Git", "Hub");
            fileIo.setValue("DesignPattern", "Adapter");
            fileIo.writeToFile("newfile.txt");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

※ fileIoインターフェイスのメソッドを用いることを強調するために、FileIo型の変数に代入している

Target

  • 基本的な読み書きの処理を宣言
FileIo.java
import java.io.*;

public interface FileIo {
    public void readFromFile(String filename) throws IOException;
    public void writeToFile(String filename) throws IOException;
    public void setValue(String key, String value);
    public String getValue(String key);
}

Adapter

  • FileIoインタフェースを実装
FileProperties.js
import java.util.*;
import java.io.*;

public class FileProperties extends Properties implements FileIo {
    public void readFromFile(String filename) throws IOException {
        load(new FileInputStream(filename));
    }

    public void writeToFile(String filename) throws IOException {
        store(new FileOutputStream(filename), "Written by FileProperties");
    }

    public void setValue(String key, String value) {
        setProperty(key, value);
    }

    public String getValue(String key) {
        return getProperty(key, "");
    }
}

実行結果

実行前

file.tex
Apple=iPod

実行後

newfile.tex
#Written by FileProperties
#Sun Feb 07 20:49:50 JST 2016
DesignPattern=Adapter
Apple=iPhone
Git=Hub
Google=Android

実行してみると、テキストが書き換えられているのがわかるかと思います

追記

  • 既存のクラスを書き換えずにAdapterパターンを利用することのメリット
    • 既存のクラス(Adaptee)をもう一度テストする必要がなくなる
    • Adapterパターンによってバグが発生しても、既存のクラス(Adaptee)にバグがないことが保証される
  • Adaptee役とTargetの機能がかけ離れてる場合は、Adapterパターンは非推奨
  • Targetをクラスすることで、委譲を利用したAdapterパターンも可能(AdapterでAdapteeのインスタンスを保持)

サンプルコードについて

以下のレポジトリにソースコードをアップしてあります。

shoheiyokoyama/design-pattern_java

デザインパターン

参考文献

Java言語で学ぶデザインパターン入門

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
46