strategy、template methodの使い方 -- およびenumの使い方

戻る



#!/bin/sh

for JAVA in *.java ; do
        CLASSNAME=`echo $JAVA|sed "s/\.java$//"`
        javap $CLASSNAME
done

Compiled from "AbstractRenderer.java"
public abstract class AbstractRenderer extends java.lang.Object implements Renderer{
    protected Node node;
    public AbstractRenderer(Node);
    public void render();
    protected abstract void renderHeaderPane();
    protected abstract void renderNavigationPane();
    protected abstract void renderMainPane();
    protected abstract void renderFooterPane();
}

Compiled from "Client.java"
public class Client extends java.lang.Object{
    public Client();
    public static void main(java.lang.String[]);
}

Compiled from "DetailPageRenderer.java"
public class DetailPageRenderer extends AbstractRenderer{
    public DetailPageRenderer(Node);
    protected void renderHeaderPane();
    protected void renderNavigationPane();
    protected void renderMainPane();
    protected void renderFooterPane();
}

Compiled from "IndexPageRenderer.java"
public class IndexPageRenderer extends AbstractRenderer{
    public IndexPageRenderer(Node);
    protected void renderHeaderPane();
    protected void renderNavigationPane();
    protected void renderMainPane();
    protected void renderFooterPane();
}

Compiled from "Material.java"
public class Material extends java.lang.Object{
    public Material();
    public void setImagePath(java.lang.String);
    public void setSentence(java.lang.String);
    public java.lang.String getImagePath();
    public java.lang.String getSentence();
}

Compiled from "Node.java"
public class Node extends java.lang.Object{
    public Node(int)       throws java.lang.Exception;
    public Node$Type getType();
    public java.util.List getMaterials();
}

Compiled from "NodeValidateException.java"
public class NodeValidateException extends java.lang.Exception{
    public NodeValidateException(java.lang.String);
}

Compiled from "Renderer.java"
public interface Renderer{
    public abstract void render();
}

Compiled from "RenderingManager.java"
public class RenderingManager extends java.lang.Object{
    public RenderingManager();
    public static Renderer createRenderer(int)       throws java.lang.Exception;
}

Compiled from "TopPageRenderer.java"
public class TopPageRenderer extends AbstractRenderer{
    public TopPageRenderer(Node);
    protected void renderHeaderPane();
    protected void renderNavigationPane();
    protected void renderMainPane();
    protected void renderFooterPane();
}

::::::::::::::
AbstractRenderer.java
::::::::::::::
/**
$Id: EnumType.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
@author KISHI Yasuhiro
*/

abstract public class AbstractRenderer implements Renderer {
    /** ノード */
    protected Node node;

    public AbstractRenderer( Node node ) {
        this.node = node;
    }

    /** テンプレートメソッド */
    public void render() {

        System.out.println( this.getClass().getName() + "クラスがインスタンス化されました。" );

        //---------------------------------------
        // 実装はサブクラスにて行われる
        //---------------------------------------
        renderHeaderPane();
        renderNavigationPane();
        renderMainPane();
        renderFooterPane();
    }

    /** ヘッダペインの出力 */
    abstract protected void renderHeaderPane();
    /** ナビゲーションペインの出力 */
    abstract protected void renderNavigationPane();
    /** メインペインの出力 */
    abstract protected void renderMainPane();
    /** フッタペインの出力 */
    abstract protected void renderFooterPane();

}
::::::::::::::
Client.java
::::::::::::::
/**
* $Id: EnumType.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
* @author KISHI Yasuhiro
* ファクトリメソッドパターンを利用するクライアントコードの例
*/

public class Client {

    static public void main( String[] args ) {
        if ( args.length != 1 ) {
            System.out.println( "Usage: java Client [nodeId]" );
            System.exit( 1 );
        }
        int nodeId = new Integer( args[ 0 ] ).intValue();

        try {
            Renderer renderer = RenderingManager.createRenderer( nodeId );

            // Rendererインタフェースは、render()メソッドを実行できる
            renderer.render();

        } catch ( Exception e ) {
            e.printStackTrace();
        }

    }
}
::::::::::::::
DetailPageRenderer.java
::::::::::::::
import java.util.*;

/**
$Id: EnumType.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
@author KISHI Yasuhiro
*/

public class DetailPageRenderer extends AbstractRenderer {

    public DetailPageRenderer( Node node ) {
        super( node );
    }

    protected void renderHeaderPane() {}
    protected void renderNavigationPane() {}
    protected void renderMainPane() {

        System.out.println( "詳細ページのメインペインを描画しています。" );

        List materials = node.getMaterials();
        Iterator iterator = materials.iterator();

        while ( iterator.hasNext() ) {
            Material material = ( Material ) iterator.next();

            System.out.printf( "*** %-20s ", material.getImagePath() );
            System.out.printf( "*** %-20s ", material.getSentence() );
            System.out.println();
        }

    }
    protected void renderFooterPane() {
        System.out.println( "詳細ページのフッタペインを描画しています。" );

    }

}
::::::::::::::
IndexPageRenderer.java
::::::::::::::
/**
$Id: EnumType.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
@author KISHI Yasuhiro
*/

public class IndexPageRenderer extends AbstractRenderer {

    public IndexPageRenderer( Node node ) {
        super( node );
    }

    protected void renderHeaderPane() {}
    protected void renderNavigationPane() {
        System.out.println( "インデックスページのナビゲーションペインを描画しています。" );
    }
    protected void renderMainPane() {
        System.out.println( "インデックスページのメインペインを描画しています。" );
    }
    protected void renderFooterPane() {}

}
::::::::::::::
Material.java
::::::::::::::
/**
$Id: EnumType.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
@author KISHI Yasuhiro
*/

public class Material {
    private String imagePath;
    private String sentence;
    public void setImagePath( String imagePath ) {
        this.imagePath = imagePath;
    }
    public void setSentence( String sentence ) {
        this.sentence = sentence;
    }

    public String getImagePath() {
        return imagePath;
    }
    public String getSentence() {
        return sentence;
    }
}
::::::::::::::
Node.java
::::::::::::::
import java.util.*;
/**
$Id: EnumType.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
@author KISHI Yasuhiro
*/

public class Node {
    static public enum Type {ROOT, CATEGORY, LEAF}
    private int nodeId;

    public Node( int nodeId ) throws Exception {
        this.nodeId = nodeId;

        try {
            validate( nodeId );
        } catch ( Exception e ) {
            throw e;
        }
    }

    private void validate( int nodeId ) throws NodeValidateException {
        if ( nodeId < 1 ) {
            throw new NodeValidateException( "ありえないノードです!" );
        }
    }

    /** ノードの種別を取得する */
    public Node.Type getType() {
        if ( nodeId == 1 ) {
            return Type.ROOT;
        } else if ( nodeId > 1 && nodeId < 10 ) {
            return Type.CATEGORY;
        } else {
            return Type.LEAF;
        }
    }

    public List getMaterials() {
        // これも実際にはデータベースから内容を取り出す
        // 以下はエミュレーションのコード

        List list = new LinkedList();
        for ( int i = 0;i < 3;i++ ) {
            Material material = new Material();
            material.setImagePath( "/tmp/canada" + i + ".jpg" );
            material.setSentence( "文言その" + i );
            list.add( material );
        }

        return list;
    }
}
::::::::::::::
NodeValidateException.java
::::::::::::::
/**
$Id: EnumType.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
@author KISHI Yasuhiro
*/

public class NodeValidateException extends Exception {

    public NodeValidateException( String message ) {
        super( message );
    }

}
::::::::::::::
Renderer.java
::::::::::::::
/**
$Id: EnumType.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
@author KISHI Yasuhiro
*/

public interface Renderer {

    public void render();
}
::::::::::::::
RenderingManager.java
::::::::::::::
/**
$Id: EnumType.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
@author KISHI Yasuhiro
*/

public class RenderingManager {

    static public Renderer createRenderer( int nodeId ) throws Exception {

        Node node;
        try {
            node = new Node( nodeId );
        } catch ( Exception e ) {
            throw e;
        }

        Renderer renderer = null;
        Node.Type type = node.getType();

        if ( type == Node.Type.ROOT ) {
            renderer = new TopPageRenderer( node );
        } else if ( type == Node.Type.CATEGORY ) {
            renderer = new IndexPageRenderer( node );
        } else if ( type == Node.Type.LEAF ) {
            renderer = new DetailPageRenderer( node );
        }

        return renderer;
    }

}
::::::::::::::
TopPageRenderer.java
::::::::::::::
/**
$Id: EnumType.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
@author KISHI Yasuhiro
*/

public class TopPageRenderer extends AbstractRenderer {

    public TopPageRenderer( Node node ) {
        super( node );
    }

    protected void renderHeaderPane() {
        System.out.println( "TOPページのヘッダペインを描画しています" );
    }
    protected void renderNavigationPane() {}
    protected void renderMainPane() {}
    protected void renderFooterPane() {}

}


■実行例

$ java Client
Usage: java Client [nodeId]

$ java Client -1
NodeValidateException: ありえないノードです!
        at Node.validate(Node.java:22)
        at Node.(Node.java:14)
        at RenderingManager.createRenderer(RenderingManager.java:12)
        at Client.main(Client.java:17)

$ java Client 1
TopPageRendererクラスがインスタンス化されました。
TOPページのヘッダペインを描画しています

$ java Client 5
IndexPageRendererクラスがインスタンス化されました。
インデックスページのナビゲーションペインを描画しています。
インデックスページのメインペインを描画しています。

$ java Client 147
DetailPageRendererクラスがインスタンス化されました。
詳細ページのメインペインを描画しています。
*** /tmp/canada0.jpg     *** 文言その0
*** /tmp/canada1.jpg     *** 文言その1
*** /tmp/canada2.jpg     *** 文言その2
詳細ページのフッタペインを描画しています。




戻る inserted by FC2 system