設計模式中的聚合和組合
阿新 • • 發佈:2020-10-20
聚合:整體與部分之前的弱關係,部分不會隨著整體生命週期的結束而結束。eg:電腦(整體)與 滑鼠(部分)
has -a 關係,父類包含子類,但子類可以獨立存在
組合:整體與部分之間的強關係,部分隨著整體生命週期的結束而結束(部分不能脫離整體單獨存在)。 eg: 鳥(整體)與 翅膀(部分)
part-of 關係,父類擁有子類,子類不能獨立與父類存在
一組關聯關係是聚合還是組合,要根據實際業務來看,兩個類,在不同的場景中可以有不同的關聯關係
程式碼案例
(1)聚合關係
namespace TestCore { public class Program { publicView Codestatic 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; } } }
執行結果:
(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
執行結果: