感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

Adapterパターンを使ってみた。今あるクラスを再利用してみる。

<スポンサーリンク>

AdapterパターンはWrapperパターンとも呼ばれる。
今あるモノを包み込んで、別の用途に使えるように変換してくれる役割を果たす。

元々あるものと適合しなくても一皮かぶせることで、使いたい用途通りに再利用できるようにする。

デザインパターンはそもそも、保守と拡張を容易にするために考えられたはずだ。
部品として再利用するために。
Adapterパターンを使うことで、動作テストがすんでいる既存のクラスを修正せずに、目的のインターフェース(API)に合わせることができる。
皮をかぶせることで、元の単体テスト済みのクラスに手を入れずに済むようになる。

UMLにするとこうなる。

さて、今回はあらかじめ動く以下のソースに対してAdapterを被せて再利用してみる。
このソースはTwitter4jを使って引数にあるStringをツイートするサンプルである。

package pattern.adapter;

import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;

public class TweetClient {
	private String consumerKey;
	private String consumerSecret;
	private String accessToken;
	private String accessTokenSecret;
	private Twitter twitter;
	
	public String getConsumerKey() {
		return consumerKey;
	}
	public void setConsumerKey(String consumerKey) {
		this.consumerKey = consumerKey;
	}
	public String getConsumerSecret() {
		return consumerSecret;
	}
	public void setConsumerSecret(String consumerSecret) {
		this.consumerSecret = consumerSecret;
	}
	public String getAccessToken() {
		return accessToken;
	}
	public void setAccessToken(String accessToken) {
		this.accessToken = accessToken;
	}
	public String getAccessTokenSecret() {
		return accessTokenSecret;
	}
	public void setAccessTokenSecret(String accessTokenSecret) {
		this.accessTokenSecret = accessTokenSecret;
	}
	
	public TweetClient(String consumerKey, String consumerSecret, String accessToken, String accessTokenSecret) {
		twitter = new TwitterFactory().getInstance();
		twitter.setOAuthConsumer(consumerKey, consumerSecret);
		twitter.setOAuthAccessToken(new AccessToken(accessToken,accessTokenSecret));
	}
	
	public void tweet(String tweet) {
		try {
			twitter.updateStatus(tweet);
		} catch (TwitterException e) {
			e.printStackTrace();
		}
	}
}

さて、とにかく何かをアウトプットしたい人がいるとする。
その人を上図のClientと見立てる。

package pattern.adapter;

public class Main {
	public static void main(String[] args) {
		Outputter out = new OutputTwitter();
		out.output("hello!World!");
	}
}

このMainの中にTweetCleintのソースは一欠片もない。
見えない状態になっている。

さて、次に被せるAdapterを実装する。
まずはoutputする人を表すInterfaceだ。

package pattern.adapter;

public interface Outputter {
	public abstract void output(String output);
}

で、それをimplementsするクラス。

package pattern.adapter;

public class OutputTwitter extends TweetClient implements Outputter {
	private static String consumerKey = "XXXXX";
	private static String consumerSecret = "YYYYYY";
	private static String accessToken = "MMMMM";
	private static String accessTokenSecret = "ZZZZZ";
	private TweetClient twitter;
	public OutputTwitter() {
		super(consumerKey,consumerSecret,accessToken,accessTokenSecret);
	}
	@Override
	public void output(String output) {
		tweet(output);
	}
	

}

こいつがTweetClientをラップしているのがわかる。
実際にMainを動かすと、Main的にはoutputしたつもりになって、中ではtwitterにoutputされるようになる。
動かしたら該当のユーザーのツイートに反映される。
UMLにするとこんな感じ。

これがAdapterパターン。
既存のクラスに一皮被せて再利用がポイントである。

参考にした本

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

感謝のプログラミング

今回で感謝のプログラミングは【239.5時間目】
10000時間まで、あと【9760.5時間】