假设您今天要开发一个动画编辑程式,动画由影格(Frame)组成,数个影格组合为动画清单,动画清单也可以由其它已完成的动画清单组成,也可以在动画清单与清单之间加入个别影格。无论是影格或动画清单都可以播放,而动画清单负责的就是组合影格或动画清单,所以可以这么设计:
对于Frame而言,Playlist是一个容器,然而Playlist也实作Playable,所以它也可以播放,您可以进一步地将Playlist组合至另一个Playlist中,以形成更长的播放清单。以Java实现的话。
以Java實現的話。
import java.util.*;
interface Playable {
void play();
}
class Frame implements Playable {
private String image;
Frame(String image) {
this.image = image;
}
public void play() {
System.out.println("播放 " + image);
}
}
class Playlist implements Playable {
private List<Playable> list = new ArrayList<Playable>();
public void add(Playable playable) {
list.add(playable);
}
public void play() {
for(Playable playable : list) {
playable.play();
}
}
}
public class Main {
public static void main(String[] args) {
Frame logo = new Frame("片頭 LOGO");
Playlist playlist1 = new Playlist();
playlist1.add(new Frame("Duke 左揮手"));
playlist1.add(new Frame("Duke 右揮手"));
Playlist playlist2 = new Playlist();
playlist2.add(new Frame("Duke 走左腳"));
playlist2.add(new Frame("Duke 走右腳"));
Playlist all = new Playlist();
all.add(logo);
all.add(playlist1);
all.add(playlist2);
all.play();
}
}
以Python實現的話:
class Frame:
def __init__(self, image):
self.image = image
def play(self):
print("播放 " + self.image)
class Playlist:
def __init__(self):
self.list = []
def add(self, playable):
self.list.append(playable);
def play(self):
for playable in self.list:
playable.play()
logo = Frame("片頭 LOGO")
playlist1 = Playlist()
playlist1.add(Frame("Duke 左揮手"))
playlist1.add(Frame("Duke 右揮手"))
playlist2 = Playlist()
playlist2.add(Frame("Duke 走左腳"))
playlist2.add(Frame("Duke 走右腳"))
all = Playlist()
all.add(logo)
all.add(playlist1)
all.add(playlist2)
all.play();以UML来表示Composite模式的结构:
具有层次性或组合性的物件可以使用Composite模式,像是电路元件、视窗元件等,使用Composite模式可以大大减低这些元件设计的复杂度,以Java标准API中AWT视窗元件为例,Component上有个paint()方法,可以进行元件的绘制,Container可以容纳Component(如Button、Label等),而Container继承Component,所以Container也可以容纳Container,这也是Composite模式的实际例子:
from :
http://caterpillar.onlyfun.net/Gossip/index.html
posted on 2012-10-12 16:20
David1228 阅读(323)
评论(0) 编辑 收藏 所属分类:
JAVA 、
线程-模式-设计