Maya の内部構造を真似たシンプルな Java プログラムの例である。
わかりやすくするためにノードは一種類(NodeA)、アトリビュートは一つだけ(int)にしている。
public interface Observer
{
public abstract void update(Node node);
}
import java.util.Vector;
import java.util.Iterator;
public abstract class Node
{
private Vector observers = new Vector();
public void connectAttr(Observer o)
{
observers.add(o);
}
public void disconnectAttr(Observer o)
{
observers.remove(o);
}
public void notifyObservers()
{
Iterator it = observers.iterator();
while(it.hasNext())
{
Observer o = (Observer)it.next();
o.update(this);
}
}
public abstract int getAttr();
public abstract void setAttr(int value);
}
public class NodeA extends Node implements Observer
{
private int attribute;
public void update(Node node)
{
setAttr(node.getAttr());
}
public int getAttr()
{
return attribute;
}
public void setAttr(int value)
{
attribute = value;
notifyObservers();
}
}
public class Main
{
public static void main(String[] args)
{
NodeA node1 = new NodeA();
NodeA node2 = new NodeA();
NodeA node3 = new NodeA();
System.out.print("( node1 " + node1.getAttr() + " ) ");
System.out.print("( node2 " + node2.getAttr() + " ) ");
System.out.println("( node3 " + node3.getAttr() + " )");
node1.connectAttr(node2);
node2.connectAttr(node3);
System.out.print("( node1 " + node1.getAttr() + " ) -> ");
System.out.print("( node2 " + node2.getAttr() + " ) -> ");
System.out.println("( node3 " + node3.getAttr() + " )");
node1.setAttr(2);
System.out.print("( node1 " + node1.getAttr() + " ) -> ");
System.out.print("( node2 " + node2.getAttr() + " ) -> ");
System.out.println("( node3 " + node3.getAttr() + " )");
}
}
% ls *.java Main.java Node.java NodeA.java Observer.java % javac Main.java % java Main ( node1 0 ) ( node2 0 ) ( node3 0 ) ← ノード node1, node2, node3 のアトリビュートの初期値は 0 ( node1 0 ) -> ( node2 0 ) -> ( node3 0 ) ← node1 から node2、 node2 から node3 へコネクトされた状態 ( node1 2 ) -> ( node2 2 ) -> ( node3 2 ) ← node1 のアトリビュートを変更すると node2, node3 も変更される