(一)合成服用原则定义
软件复用时,尽量先使用组合或者聚合关联关系来实现,次之考虑使用继承关系实现。
(二)继承复用
- 破坏封装,继承就会将父类的实现细节暴露给子类(称为白箱复用)
- 子类与父类的耦合性高,父类的实现和改变都能改变子类的变化,不利于类的扩展与维护。
- 限制了复用的灵活性
(三)合成复用(合成复用的好处,新对象可以调用已有对象的功能)
- 维持类的封装性(称为黑箱复用)
- 新旧类之间的耦合度低
- 复用的灵活性高
(四)图形解析
如上图,人类的子类是男人和女人,男人和女人都有各自的属性,如果现在想多加一个属性的话,那么就得修改代码,这样就违背了开闭原则,如果使用组合关系的方法,就能很好的处理该问题。如下图:
(五)代码解析
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; }
}
}
}
这个代码方便修改,也可以组合使用。