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 閱讀(336) 評論(0)  編輯  收藏 所屬分類: JAVA線程-模式-設計

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

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          文章檔案

          新聞分類

          新聞檔案

          相冊

          收藏夾

          Java

          Linux知識相關

          Spring相關

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

          友情博客

          多線程并發編程

          開源技術

          持久層技術相關

          搜索

          •  

          積分與排名

          • 積分 - 359269
          • 排名 - 154

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 万山特区| 桐柏县| 班玛县| 泸西县| 册亨县| 宝坻区| 防城港市| 霍邱县| 桑植县| 扎囊县| 佛学| 台湾省| 衡水市| 鄂托克旗| 扶绥县| 遂平县| 南江县| 寿光市| 托克托县| 辽阳市| 晋城| 镇原县| 富源县| 尤溪县| 尖扎县| 闽清县| 探索| 阜阳市| 洛隆县| 阜宁县| 揭阳市| 东乡族自治县| 耿马| 东莞市| 延长县| 沙湾县| 乌拉特前旗| 永州市| 南充市| 米易县| 织金县|