上一篇,總結了結構模式的一些特點,這一篇分別介紹兩種方式的實現。
這里我們用繪圖這個例子來說明Composite模式,通過一些基本圖像元素(直線、圓等)以及一些復合圖像元素(由基本圖像元素組合而成)構建復雜的圖形樹。在設計中我們對每一個對象都配備一個draw()方法,在調用時,會顯示相關的圖形。可以看到,這里復合圖像元素(Picture1、Picture)它在充當對象的同時,又是那些基本圖像元素的一個容器。
透明方式:
根節點:
package composite;
public interface Graphics1 {
void draw();
void add(Graphics1 g);
void remove(Graphics1 g);
Graphics1 gotChild(int i);
}
樹葉節點:
package composite;
public class Line1 implements Graphics1 {
public void draw(){
System.out.println("Drawing Line
");
}
public void add(Graphics1 g){
return;
}
public void remove(Graphics1 g){
return;
}
public Graphics1 gotChild(int i){
return null;
}
}
package composite;
public class Circle1 implements Graphics1 {
public void draw(){
System.out.println("Drawing Circle
");
}
public void add(Graphics1 g){
return;
}
public void remove(Graphics1 g){
return;
}
public Graphics1 gotChild(int i){
return null;
}
}
package composite;
public class Rectangle1 implements Graphics1 {
public void draw(){
System.out.println("Drawing Rectangle
");
}
public void add(Graphics1 g){
return;
}
public void remove(Graphics1 g){
return;
}
public Graphics1 gotChild(int i){
return null;
}
}
樹枝節點:
package composite;
import java.util.Vector;
public class Picture1 implements Graphics1 {
private Vector list = new Vector(10);
public void draw(){
for (int i = 0; i < list.size(); i++) {
Graphics1 g = (Graphics1) list.get(i);
g.draw();
}
}
public void add(Graphics1 g){
list.add(g);
}
public void remove(Graphics1 g){
list.remove(g);
}
public Graphics1 gotChild(int i){
return (Graphics1)list.get(i);
}
}
客戶端調用:
package composite;
public class Client1 {
private static Picture1 picture= new Picture1();
public static void main(String[] args){
picture.add(new Circle1());
picture.add(new Line1());
picture.add(new Rectangle1());
picture.draw();
}
}
安全方式:
根節點:
package composite;
public interface Graphics {
void draw();
}
樹葉節點:
package composite;
public class Circle implements Graphics {
public void draw(){
System.out.println("Drawing Circle
");
}
}
package composite;
public class Line implements Graphics {
public void draw(){
System.out.println("Drawing Line
");
}
}
package composite;
public class Rectangle implements Graphics {
public void draw(){
System.out.println("Drawing Rectangle
");
}
}
樹枝節點:
package composite;
import java.util.Vector;
public class Picture implements Graphics {
private Vector list = new Vector(10);
public void draw(){
for (int i = 0; i < list.size(); i++) {
Graphics g = (Graphics) list.get(i);
g.draw();
}
}
public void add(Graphics g){
list.add(g);
}
public void remove(Graphics g){
list.remove(g);
}
public Graphics gotChild(int i){
return (Graphics)list.get(i);
}
}
客戶端調用:
package composite;
public class Client {
private static Picture picture= new Picture();
public static void main(String args[]){
picture.add(new Circle());
picture.add(new Line());
picture.add(new Rectangle());
picture.draw();
}
}