我用composite模式寫的一個二叉樹的例子
1,Component 是抽象組件
Tree 和Leaf 繼承Component
private String name; //樹或葉子的名稱
addChild(Component leftChild,Component rightChild);
//給一個樹上加上一個左孩子,一個右孩子
getName(){return name;}
getTreeInfo(){} //得到樹或葉子的詳細信息
getLength(); //得到樹的高度
2,Tree 二叉樹,一個左孩子,一個右孩子
3,Leaf 是葉子節點
4,Test 是測試節點
/** Component.java **************/
package binarytree;
public abstract class Component {
?private String name;
?public abstract Component addChild(Component leftChild, Component rightChild);
?public String getName() {
??return name;
?}
?public void getTreeInfo() {
?}
?public abstract int getLength();
}
/** Leaf.java **************/
package binarytree;
public class Leaf extends Component {
?private String name;
?private Component leaf = null;
?public Leaf(String name) {
??this.name = name;
?}
?public Component addChild(Component leftChild, Component rightChild) {
??return this;
?}
?public String getName() {
??return name;
?}
?public int getLength() {
??return 1;
?}
?public static void main(String[] args) {
?}
}
/** Tree.java **************/
package binarytree;
public class Tree extends Component {
?private String name;
?private Component leftChild;
?private Component rightChild;
?public Tree(String name, Component leftChild, Component rightChild) {
??this.name = name;
??this.leftChild = leftChild;
??this.rightChild = rightChild;
?}
?public Tree(String name) {
??this.name = name;
??this.leftChild = null;
??this.rightChild = null;
?}
?public Component addChild(Component leftChild, Component rightChild) {
??this.leftChild = leftChild;
??this.rightChild = rightChild;
??return this;
?}
?public String getName() {
??return name;
?}
?public void getTreeInfo()
?// 得到樹或葉子的詳細信息
?// 先打印自己的名字,再遍例左孩子,再遍例右孩子
?// 如果左孩子或右孩子是樹,遞歸調用
?{
??System.out.println(" this trees name is " + getName());
??if (this.leftChild instanceof Leaf) {
???System.out.println(getName() + "s left child is "
?????+ this.leftChild.getName() + ",it is a Leaf");
??}
??if (this.leftChild instanceof Tree) {
???System.out.println(getName() + "s left child is "
?????+ this.leftChild.getName() + ",it is a Tree");
???this.leftChild.getTreeInfo();
??}
??if (this.leftChild == null) {
???System.out.println(getName() + "s left child is a null");
??}
??if (this.rightChild instanceof Leaf) {
???System.out.println(getName() + "s right child is "
?????+ this.rightChild.getName() + ",it is a Leaf");
??}
??if (this.rightChild instanceof Tree) {
???System.out.println(getName() + "s right child is "
?????+ this.rightChild.getName() + ",it is a Tree");
???this.rightChild.getTreeInfo();
??}
??if (this.rightChild == null) {
???System.out.println(getName() + "s right child is a null");
??}
??// System.out.println(getName()+"s 高度 是 "+getLength());
?}
?public int getLength() {
??// 比較左孩子或右孩子的高度,誰大,+1 返回
??// 空孩子的處理
??if (this.leftChild == null) {
???if (this.rightChild == null)
????return 1;
???else
????return this.rightChild.getLength() + 1;
??} else {
???if (this.rightChild == null) {
????return this.leftChild.getLength() + 1;
???} else {
????if ((this.leftChild.getLength()) >= (this.rightChild
??????.getLength()))
?????return this.leftChild.getLength() + 1;
????else
?????return this.rightChild.getLength() + 1;
???}
??}
?}
?public static void main(String[] args) {
?}
}
/** Test.java 測試類 **************/
package binarytree;
public class Test {
?public Test() {
?}
?public static void main(String[] args) {
??Component tree = new Tree("luopeng");
??Component left_child = new Leaf("luopeng1");
??Component right_child = new Leaf("luopeng2");
??tree = tree.addChild(left_child, right_child);
??// tree=tree.addRightChild(right_child);
??tree.getTreeInfo();
??Component tree1 = new Tree("luopeng2");
??tree1.addChild(tree, left_child);
??tree1.getTreeInfo();
??Component tree2 = new Tree("luopeng3");
??tree2.addChild(tree, null);
??tree2.getTreeInfo();
??Component tree4 = new Tree("luopeng4");
??tree4.addChild(null, tree);
??tree4.getTreeInfo();
??System.out.println(tree4.getName() + "的高度是 " + tree4.getLength());
?}
}
posted on 2006-07-31 17:33
保爾任 閱讀(562)
評論(0) 編輯 收藏 所屬分類:
Design Patten