Composite 组合

Composite 组合模式,将对象组合成树形结构以表示“部分=整体”的层次结构。使得用户在处理单个对象和组合对象时具有一致性。

 

Composite最好的一个例子就 计算机的文件系统。

 

适用性:

1、你想表达不封-整体的层次结构

2、你希望client忽略组合对象于单个对象的不同,用户将统一的使用组合结构中的所有对象。

 

结构:

 



 

 

 

例子:根据一个xml的描述生成一个文件目录

 

Compoiste模式,对待目录和文件都应该有一样的接口

 


IIterator .as

package {
    public interface IIterator {
        function reset():void;
        function next():Object;
        function hasNext():Boolean;
    }
}

 

ArrayIterator .as

package {
    public class ArrayIterator implements IIterator {
        private var index:uint = 0;
        private var collection:Array;
        
        public function ArrayIterator(collection:Array) {
            index = 0;
            this.collection = collection;
        }
        
        public function next():Object {
            return collection[index++];
        }
        
        public function reset():void {
            index = 0;
        }
        
        public function hasNext():Boolean {
            return index < collection.length;
        }
    }
}

 

NullIterator .as

package {
    public class NullIterator implements IIterator {
        public function NullIterator() {
        }
        
        public function hasNext():Boolean {
            return false;
        }
        
        public function next():Object {
            return null;
        }
        
        public function reset():void {
        
        }
    }
}

 

 

FileSystemItem .as

package {
    public class FileSystemItem implements IFileSystemItem {
        protected var parent:IFileSystemItem;
        protected var name:String;
        
        public function FileSystemItem() {
        
        }
        
        public function iterator():IIterator {
            return null;
        }
        
        public function addItem(item:IFileSystemItem):void {
        
        }
        
        public function removeItem(item:IFileSystemItem):void {
        
        }
        
        public function getName():String {
            return name;
        }
        
        public function setName(name:String):void {
            this.name = name;
        }
        
        public function getParent():IFileSystemItem {
            return parent;
        }
        
        public function setParent(parent:IFileSystemItem):void {
            this.parent = parent;
        }
    }
}
 

 

IFileSystemItem .as

package {
    public interface IFileSystemItem {
        function iterator():IIterator
        function addItem(item:IFileSystemItem):void
        function removeItem(item:IFileSystemItem):void
        function getName():String;
        function setName(name:String):void;
        function getParent():IFileSystemItem
        function setParent(parent:IFileSystemItem):void
    }
}
 

 

File .as

package {
    public class File extends FileSystemItem {
        public function File() {
        }
        
        override public function iterator():IIterator {
            return new NullIterator();
        }
    }
}
 

 

Directory .as

package {
    public class Directory extends FileSystemItem {
        private var items:Array;
        
        public function Directory() {
            items = [];
        }
        
        override public function addItem(item:IFileSystemItem):void {
            this.items.push(item);
        }
        
        override public function removeItem(item:IFileSystemItem):void {
            for(var i:uint=0;i<items.length;i++) {
                if(items[i] == item) {
                    items.splice(i,1);
                    break;
                }
             }
        }
        
        override public function iterator():IIterator {
            return new ArrayIterator(items);
        }
    }
}

 

FileSystemItemView .as

package {
    import flash.display.*;
    import flash.text.*;
    import flash.filters.*;
    
    public class FileSystemItemView extends Sprite {
        private var item:IFileSystemItem;
        private var icon:Sprite;
        private var label:TextField;
        
        public function FileSystemItemView (item:IFileSystemItem) {
            this.item = item;
            
            initIcon();
            initLabel();
        }
        
        public function get data():IFileSystemItem {
            return item;
        }
        
        private function initIcon():void {
			icon = new Sprite();
            if(item is Directory) {
                icon.graphics.lineStyle();
                icon.graphics.beginFill(0xFFFF00);
                icon.graphics.drawRect(0,10,50,30);
                icon.graphics.beginFill(0xFFFF00);
                icon.graphics.drawRoundRect(0,0,25,15,5,5);
                icon.graphics.endFill();
                
            }
            else {
                icon.graphics.lineStyle(0,0x000000,1);
				icon.graphics.beginFill(0xFFFFFF);
                icon.graphics.drawRect(0,0,40,50);
                icon.graphics.endFill();
            }
			icon.filters = [new BevelFilter()];
            addChild(icon);
        }
        
        private function initLabel():void {
            label = new TextField();
            label.text = item.getName();
            label.autoSize = TextFieldAutoSize.LEFT;
            label.x = 50;
            addChild(label);
        }
        
        public function setLabel(label:String):void {
            this.label.text = label;
        }
        
    }
}
 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值