/* 组合模式是一种结构型的设计模式,文件夹和文件构建的树形结构可以形象的理解这种模式的构建
* 主要角色有抽象构件,叶子构建,容器构建,容器构件是抽象构件的聚合
* 叶子构件和容器构建针对行为有自己的重写
* 以上提供的是透明组合模式的实现,这种方式的缺点是叶子节点实现add和remove方法是没有意义的,
* 所以可以让抽象构建只包含共同的行为抽象,把add和remove方法转移到容器构件中,这种就是安全组合模式
* 组合模式的优点
* 客户端可以一致的对待叶子和容器,不必关系处理的是单个对象还是整个组合结构
* 主要缺点,如果一个文件中只能包含一种文件类型,那么这种结构无法解决这种约束关系,需要在添加方法时
* 自行处理
* 主要角色有抽象构件,叶子构建,容器构建,容器构件是抽象构件的聚合
* 叶子构件和容器构建针对行为有自己的重写
* 以上提供的是透明组合模式的实现,这种方式的缺点是叶子节点实现add和remove方法是没有意义的,
* 所以可以让抽象构建只包含共同的行为抽象,把add和remove方法转移到容器构件中,这种就是安全组合模式
* 组合模式的优点
* 客户端可以一致的对待叶子和容器,不必关系处理的是单个对象还是整个组合结构
* 主要缺点,如果一个文件中只能包含一种文件类型,那么这种结构无法解决这种约束关系,需要在添加方法时
* 自行处理
*/
/// <summary>
/// 抽象类构建
/// </summary>
abstract class Component
{
//添加
public abstract void Add(Component c);
//删除
public abstract void Remove(Component c);
/// <summary>
/// 需要子类重写
/// </summary>
public abstract void DoSomething();
}
/// <summary>
///叶子节点
/// </summary>
class leaf:Component
{
/// <summary>
///
/// </summary>
/// <param name="c"></param>
public override void Add(Component c)
{
}
/// <summary>
///
/// </summary>
/// <param name="c"></param>
public override void Remove(Component c)
{
}
/// <summary>
///
/// </summary>
public override void DoSomething()
{
Console.WriteLine("叶子节点实现处理");
}
}
/// <summary>
/// 组件类
/// </summary>
class Composite : Component
{
private List<Component> list;
public Composite()
{
list = new List<Component>();
}
public override void Add(Component c)
{
if (!list.Contains(c))
{
list.Add(c);
}
}
public override void Remove(Component c)
{
if (list.Contains(c))
{
list.Remove(c);
}
}
/// <summary>
/// 容器类重写
/// </summary>
public override void DoSomething()
{
Console.WriteLine("容器处理实现");
}
}
class Program
{
static void Main()
{
Component c1 = new leaf();
Component c2 = new leaf();
Component c3 = new leaf();
Component c4 = new Composite();
c4.Add(c2);
c4.Add(c3);
c1.DoSomething();
c4.DoSomething();
Console.Read();
}
}