c#設計模式_全部部分模式_組合模式

wisdomone1發表於2012-06-11
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace ConsoleApplication1
{
    //葉子節點與非葉子節點皆須實現的功能
    abstract class component
    {
        protected string name;
        public component(string name)
        {
            this.name = name;
        }

        //這個抽象方法display,在葉子與非葉子中皆要實現它
        public abstract void display(int depth);
    }

    //因為葉了與非葉子節點的特徵不同,故display的實現會有不同,這也就是把display單獨抽出來放在一個抽象基類的作用吧
    class composite : component
    {
        //節點集合,故用arraylist
        private ArrayList children = new ArrayList();
        public composite(string name)
            : base(name)
        {
        }

        //封裝下就可以把指定的引數(物件或值型別)傳給arraylist的add方法
        //利用已有的系統方法,加強其功能與作用
        
        //採用了抽象基類component,它是葉子與非葉了節點類皆須實現的功能
        public void add(component component)
        {
            children.Add(component);
        }
        public void remove(component component)
        {
            children.Remove(component);
        }
        public override void display(int depth)
        {
            Console.WriteLine(new string('*',depth)+name);

            foreach (component com in children)
                com.display(depth+2);
        }
    }

    class leaf : component
    {
        public leaf(string name)
            : base(name)
        { }
        public override void display(int depth)
        {
            Console.WriteLine(new string('*',depth)+name);
        }
    }
   
    //客戶端
    class Program
    {
       
        static void Main(string[] args)
        {
            //根節點
            composite root = new composite("root");
            root.add(new leaf("葉子1"));
            root.add(new leaf("葉子2"));
            //composite.add(方法引數的型別是component)這就很靈活了,它是抽象基類,而葉子與非葉子皆繼承它,所以
            //用add可以插入葉子與非葉子的節點了,如果你換成具體的派生類就不這樣靈活了,或者說它的擴充套件性就不好了
            
            composite comp = new composite("composite x");
            comp.add(new leaf("leaf xa"));
            comp.add(new leaf("leaf xb"));
            root.add(comp);
            root.display(1);
            Console.ReadKey();
        }
        
    }

}


寫得亂,現在編碼水平很差,暫記於此

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-732476/,如需轉載,請註明出處,否則將追究法律責任。

相關文章