結(jié)構(gòu)模式之Composite——合成(部分-整體)模式實(shí)例
上一篇,總結(jié)了結(jié)構(gòu)模式的一些特點(diǎn),這一篇分別介紹兩種方式的實(shí)現(xiàn)。這里我們用繪圖這個(gè)例子來說明Composite模式,通過一些基本圖像元素(直線、圓等)以及一些復(fù)合圖像元素(由基本圖像元素組合而成)構(gòu)建復(fù)雜的圖形樹。在設(shè)計(jì)中我們對每一個(gè)對象都配備一個(gè)draw()方法,在調(diào)用時(shí),會(huì)顯示相關(guān)的圖形。可以看到,這里復(fù)合圖像元素(Picture1、Picture)它在充當(dāng)對象的同時(shí),又是那些基本圖像元素的一個(gè)容器。
透明方式:
根節(jié)點(diǎn):
package composite;
public interface Graphics1 {
void draw();
void add(Graphics1 g);
void remove(Graphics1 g);
Graphics1 gotChild(int i);
}
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;
}
}
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);
}
}
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();
}
}
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();
}
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
");
}
}
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);
}
}
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();
}
}
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();
}
}
posted on 2008-06-23 23:11 云淡風(fēng)清 閱讀(431) 評論(1) 編輯 收藏 所屬分類: Design Patterns