上一篇,總結(jié)了結(jié)構(gòu)模式的一些特點(diǎn),這一篇分別介紹兩種方式的實(shí)現(xiàn)。
這里我們用繪圖這個例子來說明Composite模式,通過一些基本圖像元素(直線、圓等)以及一些復(fù)合圖像元素(由基本圖像元素組合而成)構(gòu)建復(fù)雜的圖形樹。在設(shè)計中我們對每一個對象都配備一個draw()方法,在調(diào)用時,會顯示相關(guān)的圖形。可以看到,這里復(fù)合圖像元素(Picture1、Picture)它在充當(dāng)對象的同時,又是那些基本圖像元素的一個容器。
透明方式:
根節(jié)點(diǎn):
package composite;
public interface Graphics1 {
void draw();
void add(Graphics1 g);
void remove(Graphics1 g);
Graphics1 gotChild(int i);
}
樹葉節(jié)點(diǎn):
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;
}
}
樹枝節(jié)點(diǎn):
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);
}
}
客戶端調(diào)用:
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();
}
}
安全方式:
根節(jié)點(diǎn):
package composite;
public interface Graphics {
void draw();
}
樹葉節(jié)點(diǎn):
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
");
}
}
樹枝節(jié)點(diǎn):
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);
}
}
客戶端調(diào)用:
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();
}
}