1+ 组合对象保存了它下面的子节点的引用,这是组合模式的特点,此时树结构是从上至下的
2+ 但有时候我们需要在子节点上保持对父节点的引用,比如在组合模式中使用职责链时,有可能需要让请求从子节点往父节点上冒泡传递
3+ 还有当我们删除某个文件的时候,实际上是从这个文件所在的上层文件夹中删除该文件的
4+ < script type ="text/javascript ">
5+ /**
6+ * Folder
7+ * parent & remove
8+ */
9+ var Folder = function ( name ) {
10+ this . name = name ;
11+ this . parent = null ; //增加this.parent 属性
12+ this . files = [ ] ;
13+ } ;
14+ Folder . prototype . add = function ( file ) {
15+ file . parent = this ; //设置父对象
16+ this . files . push ( file ) ;
17+ } ;
18+ Folder . prototype . scan = function ( ) {
19+ console . log ( '开始扫描文件夹: ' + this . name ) ;
20+ for ( var i = 0 , file , files = this . files ; file = files [ i ++ ] ; ) {
21+ file . scan ( ) ;
22+ }
23+ } ;
24+ Folder . prototype . remove = function ( ) {
25+ if ( ! this . parent ) { //根节点或者树外的游离节点
26+ return ;
27+ }
28+ for ( var files = this . parent . files , l = files . length - 1 ; l >= 0 ; l -- ) {
29+ var file = files [ l ] ;
30+ if ( file === this ) {
31+ files . splice ( l , 1 ) ;
32+ }
33+ }
34+ } ;
35+ /**
36+ * File
37+ * parent & remove
38+ */
39+ var File = function ( name ) {
40+ this . name = name ;
41+ this . parent = null ;
42+ } ;
43+
44+ File . prototype . add = function ( ) {
45+ throw new Error ( '不能添加在文件下面' ) ;
46+ } ;
47+
48+ File . prototype . scan = function ( ) {
49+ console . log ( '开始扫描文件: ' + this . name ) ;
50+ } ;
51+
52+ File . prototype . remove = function ( ) {
53+ if ( ! this . parent ) { //根节点或者树外的游离节点
54+ return ;
55+ }
56+ for ( var files = this . parent . files , l = files . length - 1 ; l >= 0 ; l -- ) {
57+ var file = files [ l ] ;
58+ if ( file === this ) {
59+ files . splice ( l , 1 ) ;
60+ }
61+ }
62+ } ;
63+
64+ var folder = new Folder ( '学习资料' ) ;
65+ var folder1 = new Folder ( 'JavaScript' ) ;
66+ var file1 = new Folder ( '深入浅出Node.js' ) ;
67+
68+ folder1 . add ( new File ( 'JavaScript 设计模式与开发实践' ) ) ;
69+ folder . add ( folder1 ) ;
70+ folder . add ( file1 ) ;
71+ folder1 . remove ( ) ; //移除文件夹
72+
73+ folder . scan ( ) ;
74+
75+ </ script >
0 commit comments