このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
ClientMessage はインタフェースだ。
インタフェースには実装が含まれないため、
利用側と実装側の依存性を最小限に抑える事ができる。
インタフェースを実装する側のクラスでは、
実装したインタフェースに示された、
全てのメソッドの定義を提供する必要がある。
インタフェースの実装にはお決まりのパターンがあるため、
インタフェースの既定の実装を提供しておけば、
それを実装するクラスの手間を最小化する事ができる。
そこで、クライアントメッセージの基本実装を提供する
BaseClientMessage 抽象クラスを作ることにする。
========== BaseClientMessage.java ==========
package jp.loafer.rfb.message.client;
import java.io.IOException;
import jp.loafer.rfb.RFBContext;
import jp.loafer.rfb.io.RFBInputStream;
import jp.loafer.rfb.io.RFBOutputStream;
/**
* BaseClientMessage クラス。
* @author kes
*/
public abstract class BaseClientMessage implements ClientMessage {
/**
* {@link BaseClientMessage} のインスタンスを作成。
*/
public BaseClientMessage() {
// 固有処理なし
}
/**
* @see jp.loafer.rfb.message.Message#read(RFBContext, RFBInputStream)
*/
public void read(RFBContext context, RFBInputStream in) throws IOException {
int value = in.readU8();
if (value != getType()) throw new IOException("Message type mismatch");
}
/**
* @see jp.loafer.rfb.message.Message#write(RFBContext, RFBOutputStream)
*/
public void write(RFBContext context, RFBOutputStream out) throws IOException {
out.writeU8(getType());
}
}
========== end of BaseClientMessage.java ==========
getType の実装は、最終的な具象クラスに任せるしかないが
クライアントメッセージの先頭には
種類を表す 1 バイトが存在するため、
read や write には共通の実装があるので用意した。
残念ながら ClientMessage がシンプルなので、
BaseClientMessage の実装もそれほど多くないため、
このクラスはそれほど役には立っていない。
まあ、複雑なインタフェースであれば、
その基本実装を用意するのはいいことである。