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;
}
}
}