(一)合成服用原則定義
軟件複用時,儘量先使用組合或者聚合關聯關係來實現,次之考慮使用繼承關係實現。
(二)繼承複用
- 破壞封裝,繼承就會將父類的實現細節暴露給子類(稱爲白箱複用)
- 子類與父類的耦合性高,父類的實現和改變都能改變子類的變化,不利於類的擴展與維護。
- 限制了複用的靈活性
(三)合成複用(合成複用的好處,新對象可以調用已有對象的功能)
- 維持類的封裝性(稱爲黑箱複用)
- 新舊類之間的耦合度低
- 複用的靈活性高
(四)圖形解析
如上圖,人類的子類是男人和女人,男人和女人都有各自的屬性,如果現在想多加一個屬性的話,那麼就得修改代碼,這樣就違背了開閉原則,如果使用組合關係的方法,就能很好的處理該問題。如下圖:
(五)代碼解析
using System;
namespace Design_Pattern
{
class Program
{
static void Main(string[] args)
{
}
/// <summary>
/// 人類接口
/// </summary>
public interface People
{
}
/// <summary>
/// 男人
/// </summary>
public class Man
{
/// <summary>
/// 姓名
/// </summary>
public String Name { get; set; }
/// <summary>
/// 身份證
/// </summary>
public String Identity { get; set; }
/// <summary>
/// 出生日期
/// </summary>
public String Birth { get; set; }
/// <summary>
/// 家庭住址
/// </summary>
public String Address { get; set; }
}
/// <summary>
/// 女人
/// </summary>
public class Woman
{
/// <summary>
/// 姓名
/// </summary>
public String Name { get; set; }
/// <summary>
/// 身份證
/// </summary>
public String Identity { get; set; }
/// <summary>
/// 出生日期
/// </summary>
public String Birth { get; set; }
/// <summary>
/// 家庭住址
/// </summary>
public String Address { get; set; }
}
}
}
這個是原來圖一的,圖二的解析如下:
using System;
namespace Design_Pattern
{
class Program
{
static void Main(string[] args)
{
}
/// <summary>
/// 人類接口
/// </summary>
public interface People
{
}
/// <summary>
/// 男人
/// </summary>
public class Man
{
}
/// <summary>
/// 女人
/// </summary>
public class Woman
{
}
public class Attribute
{
/// <summary>
/// 姓名
/// </summary>
public String Name { get; set; }
/// <summary>
/// 身份證
/// </summary>
public String Identity { get; set; }
/// <summary>
/// 出生日期
/// </summary>
public String Birth { get; set; }
/// <summary>
/// 家庭住址
/// </summary>
public String Address { get; set; }
}
}
}
這個代碼方便修改,也可以組合使用。