C#设计模式——组合模式
前言
组合模式是结构型模式。将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
方案思路
组合模式需要以下3个模块:
组合部件(Component):它是一个抽象角色,为要组合的对象提供统一的接口
叶子(Leaf):在组合中表示子节点对象,叶子节点不能有子节点。
合成部件(Composite):定义有枝节点的行为,用来存储部件,实现在Component接口中的有关操作,如增加(Add)和删除(Remove)。
另外组合模式有两种组合方式,一种是透明组合,另一种是安全组合。
下面的示例中使用了透明组合,如果需要换成安全组合只需在抽象类里面讲add,remove方法删掉,再到composite类里面专门写上。
Code
以下代码经过测试,可直接在项目中使用
/// <summary>
/// 测试类
/// </summary>
public class CompositeTest : MonoBehaviour
{
void Start()
{
Line line = new Line("线");
Circle circle = new Circle("圆");
line.Draw();
circle.Draw();
ComplexDrawing complexDrawing = new ComplexDrawing("复合图形:圆与线");
complexDrawing.Add(new Line("线"));
complexDrawing.Add(new Circle("圆"));
complexDrawing.Draw();
}
}
/// <summary>
/// 图像抽象类:Component
/// </summary>
public abstract class Drawing
{
protected string Name;
public Drawing(string name)
{
this.Name = name;
}
public abstract void Add(Drawing drawing);
public abstract void Remove(Drawing drawing);
public abstract void Draw();
}
/// <summary>
/// 单个图像_线:Leaf
/// </summary>
public class Line : Drawing
{
public Line(string name) : base(name)
{
}
public override void Add(Drawing drawing)
{
throw new Exception("不能向简单图形Line添加其他图形");
}
public override void Remove(Drawing drawing)
{
throw new System.NotImplementedException("不能向简单图形Line移除其他图形");
}
public override void Draw()
{
Debug.Log("画一个"+Name);
}
}
/// <summary>
/// 单个图像_圆:Leaf
/// </summary>
public class Circle : Drawing
{
public Circle(string name) : base(name)
{
}
public override void Add(Drawing drawing)
{
throw new Exception("不能向简单图形Circle添加其他图形");
}
public override void Remove(Drawing drawing)
{
throw new System.NotImplementedException("不能向简单图形Circle移除其他图形");
}
public override void Draw()
{
Debug.Log("画一个"+Name);
}
}
/// <summary>
/// 复合图形:Composite
/// </summary>
public class ComplexDrawing : Drawing
{
private List<Drawing> LIST_Drawing;
public ComplexDrawing(string name) : base(name)
{
LIST_Drawing = new List<Drawing>();
}
public override void Add(Drawing drawing)
{
LIST_Drawing.Add(drawing);
}
public override void Remove(Drawing drawing)
{
LIST_Drawing.Remove(drawing);
}
public override void Draw()
{
Debug.Log("画一个" + Name);
foreach (var item in LIST_Drawing)
{
item.Draw();
}
}
}
输出结果
END
感谢阅读
你知道的越多,你不知道的越多
我是EAST
一个靠互联网苟且偷生的程序员
咱们下期见!
扫描二维码关注我吧