设计模式练习:Composite模式

<textarea cols="50" rows="15" name="code" class="c-sharp">package { public class Tree { private var name:String public function Tree(name:String) { this.name=name; } public function Add(node:Tree):void { } public function get Name():String { return this.name; } public function Remove(node:Tree):void { } //返回对象列表 public function children():Array { return null; } public function getChild(name:String):Tree { return null; } public function Display():void { } } }</textarea>

 

今天仿了一个设计模式进行练习,这个和计算机数据结构的树很有关系,或者在我们使用的DisplayObjectContainer 容器类也有很大的关系,因为它的设计就是根据这个模式来设计来进行的。我们可以发现

DisplayObjectContainer 类当中也存在添加子叶 如下面

 
addChild(child: DisplayObject): DisplayObject
将一个 DisplayObject 子实例添加到该 DisplayObjectContainer 实例中

 

同样也有删除的操作 ,

 
removeChild(child: DisplayObject): DisplayObject
从 DisplayObjectContainer 实例的子列表中删除指定的 child DisplayObject 实例。

检索的操作,交换的操作。等等。

 

 

通过这个模式,我们可以发现原来adobe 设计师已经在设计这个类的时候 加入这个模式当中去。这样我们对这种开发的方法有所了解后,更加会明白了。这些与数据结构有很多关系,我们不知不觉已经使用这些东西,是不是很神奇呢?

 

 

<textarea cols="50" rows="15" name="code" class="c-sharp:nocontrols">package { public class Node extends Tree { private var list:Array=new Array(); public function Node(name:String) { super(name); } override public function Add(node:Tree):void { list.push(node); } override public function Remove(node:Tree):void { for(var i in list) { if(list[i]==node) { list.splice(i,1); } }//查询对应的键,就可以知道数组存取的值 } override public function children():Array { return list; } override public function getChild(Name:String):Tree { var mytree:Tree=null; for each(var tree:Tree in list) { if(tree.Name==Name) { mytree=tree; break; } } return mytree; } override public function Display():void { trace(this.Name); for each(var tree:Tree in list) { trace(tree.Name); } } } }</textarea>

 

 结合到这种结构,我们同样也可以实现一些很不错的效果。尝试一下

 

<textarea cols="50" rows="15" name="code" class="c-sharp">package { import flash.display.Sprite; import flash.events.*; public class Test extends Sprite { private var node:Node; public function Test() { node=new Node("一级分类"); node.Add(new Tree("金刚狼")); node.Add(new Tree("磁力保密")); node.Display(); var node2:Node=new Node("二级分类"); node2.Add(new Tree("英雄")); node2.Add(new Tree("越狱")); node2.Display(); var tree:Tree=node2.getChild("英雄"); trace(tree.Name); } } }</textarea>

你可能感兴趣的:(设计模式练习:Composite模式)