1. 程式人生 > 實用技巧 >設計模式中的聚合和組合

設計模式中的聚合和組合

聚合:整體與部分之前的弱關係,部分不會隨著整體生命週期的結束而結束。eg:電腦(整體)與 滑鼠(部分)

has -a 關係,父類包含子類,但子類可以獨立存在

組合:整體與部分之間的強關係,部分隨著整體生命週期的結束而結束(部分不能脫離整體單獨存在)。 eg: 鳥(整體)與 翅膀(部分)

part-of 關係,父類擁有子類,子類不能獨立與父類存在

一組關聯關係是聚合還是組合,要根據實際業務來看,兩個類,在不同的場景中可以有不同的關聯關係

程式碼案例

(1)聚合關係

namespace TestCore
{
    public class Program
    {
        public
static void Main(string[] args) { Name testName = new Name() { ChineseName = "小明" }; Address testAddress = new Address() { HomeAddress ="地球" }; Student testStudent = new Student(testName, testAddress); Console.WriteLine("更改前的名稱:" + testStudent._name.ChineseName); Console.WriteLine(
"更改前的地址:" + testStudent._address.HomeAddress); Console.WriteLine("開始更改 testName 與 testAddress 的值-------------"); testName.ChineseName = "小明(更改後)"; testAddress.HomeAddress = "地球(更改後)"; Console.WriteLine("更改後的名稱:" + testStudent._name.ChineseName); Console.WriteLine(
"更改後的地址:" + testStudent._address.HomeAddress); } } public class Student { public Name _name; public Address _address; /* 此處Name和Address與Student是聚合關係,子類Name與Address的生命週期不會隨著Student的生命週期結束而結束 且此處Name與Address在Student中出現是以地址的形式,並未開闢新的儲存空間,而是將現有的物件的地址傳遞給了Student類的屬性,當外界name物件與address物件發生變化時,Student的這兩個屬性會隨之變換 */ public Student(Name name, Address address) { this._name = name; this._address = address; } } public class Name{ public string ChineseName { get; set; } } public class Address { public string HomeAddress { get; set; } } }
View Code

執行結果:

(2)組合關係

namespace TestCore
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Name testName = new Name() { ChineseName = "小明" };
            Address testAddress = new Address() { HomeAddress ="地球" };
            Student testStudent = new Student(testName, testAddress);
            Console.WriteLine("更改前的名稱:" + testStudent._name.ChineseName);
            Console.WriteLine("更改前的地址:" + testStudent._address.HomeAddress);
            Console.WriteLine("開始更改 testName 與 testAddress 的值-------------");
            testName.ChineseName = "小明(更改後)";
            testAddress.HomeAddress = "地球(更改後)";
            Console.WriteLine("更改後的名稱:" + testStudent._name.ChineseName);
            Console.WriteLine("更改後的地址:" + testStudent._address.HomeAddress);
        }
    }

    public class Student {
        public Name _name;
        public Address _address;
        /*
         此處Name和Address與Student是組合關係,Name與Address在Student中開闢了新的儲存空間,傳給Student的不是一個地址,而是一個獨立的物件,這個物件和外部的testName、testAddress已經沒有關係,不會隨之改變
         */
        public Student(Name name, Address address)
        {
            this._name = new Name() { ChineseName = name.ChineseName};
            this._address = new Address() { HomeAddress = address.HomeAddress};
        }
    }
    public class Name{
        public string ChineseName { get; set; }
    }

    public class Address { 
        public string HomeAddress { get; set; }
    }
}
View Code

執行結果: