<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 167,  comments - 30,  trackbacks - 0
    假設(shè)您今天要開發(fā)一個(gè)動(dòng)畫編輯程式,動(dòng)畫由影格(Frame)組成,數(shù)個(gè)影格組合為動(dòng)畫清單,動(dòng)畫清單也可以由其它已完成的動(dòng)畫清單組成,也可以在動(dòng)畫清單與清單之間加入個(gè)別影格。無論是影格或動(dòng)畫清單都可以播放,而動(dòng)畫清單負(fù)責(zé)的就是組合影格或動(dòng)畫清單,所以可以這么設(shè)計(jì):




    對于Frame而言,Playlist是一個(gè)容器,然而Playlist也實(shí)作Playable,所以它也可以播放,您可以進(jìn)一步地將Playlist組合至另一個(gè)Playlist中,以形成更長的播放清單。以Java實(shí)現(xiàn)的話。
    以Java實(shí)現(xiàn)的話。
    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實(shí)現(xiàn)的話:
    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模式的結(jié)構(gòu):



    具有層次性或組合性的物件可以使用Composite模式,像是電路元件、視窗元件等,使用Composite模式可以大大減低這些元件設(shè)計(jì)的復(fù)雜度,以Java標(biāo)準(zhǔn)API中AWT視窗元件為例,
    Component上有個(gè)paint()方法,可以進(jìn)行元件的繪制,Container可以容納Component(如Button、Label等),而Container繼承Component,所以Container也可以容納Container,這也是Composite模式的實(shí)際例子:
     

    from : http://caterpillar.onlyfun.net/Gossip/index.html 



    posted on 2012-10-12 16:20 David1228 閱讀(342) 評論(0)  編輯  收藏 所屬分類: JAVA線程-模式-設(shè)計(jì)

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

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    文章檔案

    新聞分類

    新聞檔案

    相冊

    收藏夾

    Java

    Linux知識(shí)相關(guān)

    Spring相關(guān)

    云計(jì)算/Linux/虛擬化技術(shù)/

    友情博客

    多線程并發(fā)編程

    開源技術(shù)

    持久層技術(shù)相關(guān)

    搜索

    •  

    積分與排名

    • 積分 - 359858
    • 排名 - 154

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 中文字幕视频免费在线观看| 无遮挡a级毛片免费看| 在线观看免费无码专区| 亚洲精品国产高清嫩草影院 | 久久久久国色AV免费观看性色| 久久精品国产亚洲AV大全| 在线永久免费观看黄网站| 亚洲www77777| 日韩免费观看视频| 亚洲AV网一区二区三区| 亚洲AⅤ视频一区二区三区 | 亚洲AV无码精品色午夜在线观看| 两性色午夜视频免费网| 久久91亚洲精品中文字幕| 亚洲日韩精品A∨片无码加勒比| 好吊妞在线新免费视频| 亚洲国产婷婷香蕉久久久久久| 免费夜色污私人影院网站| 亚洲日韩欧洲无码av夜夜摸| 精品在线免费观看| 亚洲成aⅴ人片在线观| 免费人成视频在线| 免费国产在线精品一区| 亚洲Av永久无码精品三区在线 | 无码人妻精品一二三区免费| 亚洲成a∨人片在无码2023| 亚洲国产精品碰碰| 亚洲人成77777在线播放网站不卡| 精品免费国产一区二区| 无码日韩人妻AV一区免费l| 亚洲AV福利天堂一区二区三| 日本一区二区三区免费高清| 男女交性无遮挡免费视频| 午夜亚洲国产理论秋霞| 成人免费无毒在线观看网站| 国产免费人成视频尤勿视频| 亚洲视频精品在线观看| 亚洲精品国产精品国自产观看| 永久看日本大片免费35分钟 | 国产亚洲精品福利在线无卡一| 精品熟女少妇av免费久久|