posts - 167,  comments - 30,  trackbacks - 0
          假設您今天要開發一個動畫編輯程式,動畫由影格(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 閱讀(337) 評論(0)  編輯  收藏 所屬分類: JAVA線程-模式-設計

          <2012年10月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          文章檔案

          新聞分類

          新聞檔案

          相冊

          收藏夾

          Java

          Linux知識相關

          Spring相關

          云計算/Linux/虛擬化技術/

          友情博客

          多線程并發編程

          開源技術

          持久層技術相關

          搜索

          •  

          積分與排名

          • 積分 - 359430
          • 排名 - 154

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 大城县| 乐亭县| 福贡县| 浦县| 桂阳县| 古丈县| 香格里拉县| 海宁市| 武隆县| 衡水市| 龙江县| 芜湖市| 鸡西市| 嵊州市| 洛阳市| 襄城县| 辽中县| 汾西县| 于田县| 张家界市| 仪陇县| 平乐县| 东台市| 扶余县| 天峻县| 阳新县| 安徽省| 得荣县| 寿阳县| 永善县| 青冈县| 凤冈县| 广灵县| 镇平县| 大英县| 宽城| 北安市| 阜阳市| 衡南县| 湟源县| 七台河市|