2007 年 1 月 4 日 23 時 27 分

クライアントメッセージの基本実装


このアーカイブは同期化されません。 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 の実装もそれほど多くないため、
このクラスはそれほど役には立っていない。

まあ、複雑なインタフェースであれば、
その基本実装を用意するのはいいことである。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.