目次
Javaちょっとできるプログラマ。教育業界のエンジニアです。
何か新しい機能Targetが必要となった際に、既に十分な運用実績があり信頼できるクラスAdapteeがある場合において、もしもそのクラスAdapteeを使い回して新しい機能Targetが実現できるのであれば、1から実装し直すよりも手間が省けます。既存のクラスAdapteeが要求仕様を満たすように適合させるものAdapterを用意することでこれを実現します。AdapterはWrapperとよばれることもあります。
要求仕様Targetがinterfaceで与えられている場合
既存の信頼できるクラスAdapteeが、SSV (Space separated values) を出力する機能を有しているとします。これをAdapterでラップして、新たな要求仕様Targetがinterfaceで指示する通り、CSVで出力できるようにします。
sample.java
interface Target {public abstract String getCsv();}
class Adaptee {
private int arr[];
public Adaptee(int arr[]) {this.arr=arr;}
public String getSsv() { //Space separated values
StringBuilder sb = new StringBuilder();
for(int i=0; i<arr.length; ++i) {
sb.append(arr[i]);
if(i<arr.length-1) sb.append(" ");
}
return sb.toString();
}
}
class Adapter extends Adaptee implements Target {
public Adapter(int arr[]) {super(arr);}
public String getCsv() {
String str = getSsv();
StringBuilder sb = new StringBuilder();
for(int i=0; i<str.length(); ++i) {
if(str.charAt(i) == ' ') sb.append(',');
else sb.append(str.charAt(i));
}
return sb.toString();
}
}
class Sample {
public static void main(String args[]) {
int arr[] = {1,2,4,8,16};
Target target = new Adapter(arr);
System.out.println(target.getCsv());
}
}
実行例
$ javac sample.java && java Sample
1,2,4,8,16
要求仕様Targetが抽象クラスで与えられている場合
Javaでは多重継承ができないため、要求仕様Targetが抽象クラスで与えられている場合は、AdapterはAdapteeを先程のようにextendsするのではなく、メンバ変数としてhasし委譲することによってAdapteeを利用します。
sample.java
abstract class Target {public abstract String getCsv();}
class Adaptee {
private int arr[];
public Adaptee(int arr[]) {this.arr=arr;}
public String getSsv() { //Space separated values
StringBuilder sb = new StringBuilder();
for(int i=0; i<arr.length; ++i) {
sb.append(arr[i]);
if(i<arr.length-1) sb.append(" ");
}
return sb.toString();
}
}
class Adapter extends Target {
private Adaptee adaptee;
public Adapter(int arr[]) {adaptee=new Adaptee(arr);}
public String getCsv() {
String str = adaptee.getSsv();
StringBuilder sb = new StringBuilder();
for(int i=0; i<str.length(); ++i) {
if(str.charAt(i) == ' ') sb.append(',');
else sb.append(str.charAt(i));
}
return sb.toString();
}
}
class Sample {
public static void main(String args[]) {
int arr[] = {1,2,4,8,16};
Target target = new Adapter(arr);
System.out.println(target.getCsv());
}
}
実行例
$ javac sample.java && java Sample
1,2,4,8,16
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- Spring Security フォームログインのサンプルコードSpring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
- Java配列の宣言方法 (C/C++との違い)Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
- PlantUML による UML 図の描き方PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
- Akka HTTP サンプルコード (Scala)Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
- Kestrel の使用例Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...