`

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

 

 

 

 

 

  • 大小: 52.6 KB
  • 大小: 32.2 KB
  • 大小: 77.8 KB
分享到:
评论

相关推荐

    C#面向对象设计模式纵横谈(9):Composite 组合模式(结构型模式)

    ### C#面向对象设计模式纵横谈之Composite组合模式解析 #### 标题解析与核心概念 标题中的“C#面向对象设计模式纵横谈(9):Composite组合模式(结构型模式)”明确了文章的主题聚焦于C#语言环境下的设计模式探讨,...

    C#面向对象设计模式纵横谈\9 结构型模式Composite组合模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第9节:结构型模式Composite组合模式

    C#面向对象设计模式纵横谈(9):Composite 组合模式(结构型模式) (Level 300)

    3. **组合节点(Composite)**: 具有子组件的节点,也实现了Component接口,除了处理自己的业务逻辑外,还负责管理子组件。它可以包含其他Composite或Leaf对象。 **三、实现** 在C#中,我们可以定义如下的组件接口...

    设计模式之组合模式(Composite Pattern)

    3. **Composite(组合)**:组合节点是包含其他Component对象的容器。它们也实现了Component接口,因此可以被客户端当作普通的Component对象处理。此外,Composite还负责管理其子对象,比如添加、删除和操作子对象。...

    Composite Pattern(组合模式)

    **组合模式(Composite Pattern)详解** 组合模式是一种结构型设计模式,它将对象组织成树形结构,使得用户可以对单个对象和对象集合进行统一操作。这种模式在处理部分与整体关系时非常有用,允许我们一致地处理...

    组合模式 Composite Pattern

    **组合模式**(Composite Pattern)是一种常用的结构型设计模式,主要用于构建具有层次结构的对象系统。它允许客户端以一致的方式处理单个对象和组合对象,简化了高层模块的调用。通过组合模式,可以将多个对象组织成...

    23种Python设计模式示例演示源码包.rar

    23种Python设计模式示例演示源码包,比如包括了工厂模式、Bridge桥接模式、Builder构建模式、Facade外观模式、Adapter适配器模式,Composite组合模式、Decorator装饰器模式,FactoryMethod工厂方法模式、Flyweight享...

    设计模式C++学习之组合模式(Composite)

    组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分-整体关系,使得我们能够以统一的方式处理单个对象和对象集合。在C++中,组合模式的应用可以帮助我们构建灵活且易于操作的对象层次结构,使得客户端...

    c++-设计模式之组合模式(Composite Pattern)

    组合模式(Composite Pattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户端可以以统一的方式对待单个对象和组合对象,这种模式常用于需要处理树形结构的数据...

    23个软件设计类图详解.rar

    3、Composite 组合模式 4、Decorator装饰者 5、Façade 外观、门面 6、Flyweight 享元模式 7、Proxy 代理模式 11个行为模式: 1、Chain of Responsibility 职责链 2、Command 命令 3、Interpreter 解释器 ...

    组合模式(Composite Pattern)原理图

    组合模式(Composite Pattern)是一种对象结构型模式,其定义是将多个对象组合成树形结构以表示“整体-部分”关系的层次结构。它使得客户端对单个对象和组合对象的使用具有一致性。在组合模式中,对象被组织成树形...

    Composite.zip

    在`Composite.zip`这个文件中,包含的示例应该展示了如何使用组合模式来实现这一概念。 在设计模式的世界里,组合模式是一种非常实用的工具,尤其在处理具有树形结构的数据时。它将个体对象(叶子对象)和组合对象...

    C++设计模式课件20_Composite_组合模式.pdf

    组合模式(Composite Pattern)是一种树形结构的设计模式,它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户可以对单个对象和组合对象进行一致性的操作处理,即客户程序可以像操作单个对象...

    Composite模式

    **复合模式(Composite Pattern)**是一种结构型设计模式,它允许我们构建复杂的对象结构,并能像操作单个对象一样处理整个结构。在计算机科学中,这种模式尤其适用于表示部分-整体层次结构,使得用户可以一致地处理...

    c#面向对象设计模式纵横谈

    4. **Composite 组合模式**:Composite允许你将对象组织成树形结构,可以对单个对象和对象组合进行相同的操作。在C#中,通常通过定义一个基类,然后让组合类和叶子类继承该基类来实现。 5. **Proxy 代理模式**:...

    二十三种设计模式【PDF版】

    设计模式之 Composite(组合) 就是将类用树形结构组合成一个单位.你向别人介绍你是某单位,你是单位中的一个元素,别人和你做买卖,相当于 和单位做买卖。文章中还对 Jive再进行了剖析。 设计模式之 Decorator(装饰...

    C++ Composite模式

    在C++中,Composite模式使得客户可以对单个对象和对象组合进行一致的处理,这种模式常用于构建复杂的系统,其中组件可以有自己的子组件,形成一种树形结构。 ### 一、模式定义 Composite模式的核心思想是将对象...

Global site tag (gtag.js) - Google Analytics