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
詳細ページのフッタペインを描画しています。
戻る