智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...

导航

组合模式(composite)

Posted on 2009-11-23 15:01  Bill Yuan  阅读(346)  评论(0编辑  收藏  举报
我中午吃六两饭,猪肉炖粉条,辣子鸡,鱼丸,咸鸭蛋,外加两杯酸奶(猪!)
这些东西都是对象,他们共同组成了我的午饭。

举例:应该说在Flash里组合模式是无处不在的,因为只要还有mc的嵌套,就有组合模式存在。几个mc装在一个mc里,这个装载用的mc称作容器。
但是就这么说,恐怕没人会重视这个模式,因为不管理不理解他我们都在用。他的确有很多种实现方式,我的方式之一是这样的。

//blog.as
class Blog extends BaseMovie {
    
//blog第一界面,包括日记列表,日历,最近留言
    var mcBlogList: mcBlogList;
    
//blog第二界面,包括日记全文,回复,对该日记的留言。
    var mcBlogDairy:MovieClip;
    var currentState:String;
    var currentDairyID:Number;
    function blog(){
    }
}
 
//mcBlogList.as
//blog第一界面
class mcBlogList extends BaseMovie {
    
//最近留言
    var recentMsgs:blogMsgsSC;
    
//日记列表
    var blogList:BlogList;
    
//日历
    var calendar:CalenderForBlog;
     

//mcblogDairy.as
//blog第二界面
class mcBlogDairy extends BaseMovie {
    
//日记全文显示
    var BlogDairy:BlogDairy;
    
//留言板
    var GuestBook:BlogInputMsg;
    
//留言列表显示
    var BlogMsgs:BlogMsgs;
}

然后里面每个组件都还包含另外的组件,比如滚动条,动态文本框什么的,我想说的是,我写在as里的mc嵌套模式并不一定就符合fla文件里的具体物理嵌套模式,有很多装饰性的mc不需要包含进来,也有很多具体原因,需要改写路径。比如在BlogDairy下,滚动条的实际路径是 BlogDairy.mc1.ScrollBar,不做成BlogDairy.ScrollBar可能是因为我需要mc1的动画,也可能是别的具体原因。但是我们可以在mc1的时间轴上加一句

_parent. ScrollBar =This.ScrollBar

把路径指向改写,达到我们要使用的模式,ScrollBar就是BlogDairy的直接成员。另外我没有语句初始化mc,我习惯在库里设置mc的linkage。

备注:虽然组合模式是每个人必不可少要用的,但正因为如此,我们可以想出他更多更好更灵活的实现方式