极速理解设计模式系列:5.组合模式(Composite Pattern)

简介:

四个角色:部件抽象接口角色(Component)、叶角色(Leaf)、组合类角色(Composite)、客户端角色(Client)

        部件抽象接口角色(Component):定义组合类对象的公共行为、属性和管理子部件的方法接口。

        叶角色(Leaf):实现Component的公共行为,但是无法管理子部件,为最终叶节点。

        组合类角色(Composite):实现Component的公共行为,可以管理子节点(增、删、查)。

        客户端角色(Client):通过Component控制整棵组合对象树。

         实现思路:一棵树,分为叶节点和主干节点,通过一个统一的接口可以往下添加节点和删除节点。

 类图:

   

        应用场景:Silverlight中一个Canvas名为Layout,需要有很多行,第一行是一个TextBox,第二行是一个RichTextBox,第三行是RadioButton,第四行是一个复杂的组合控件名为complex其内部有RadioButtonA、ComboBoxB、TextBoxC三个子控件。

        分析:这里实际上可以看做是一棵树型结构的容器Layout,内部有4个控件,其中3个简单控件是叶节点,最后一个复杂控件是主干,主干下面还有3个叶片节点。

        下面我们在控制台程序去演示一下如何使用Composite Pattern:

        一、部件抽象接口角色(Component)

复制代码
    //部件抽象接口角色:Component
abstract class ControlComponent
{
public string ControlName { get; set; }
public double Width { get; set; }
public double Height { get; set; }
public int AllowInputNum { get; set; }
abstract public void AddNode(ControlComponent con);
abstract public void RemoveNode(ControlComponent con);
abstract public void ShowNodeInfo();
}
复制代码

        二、叶角色(Leaf)

复制代码
   //叶角色:Leaf
class ControlLeaf : ControlComponent
{
//叶角色没有子节点,故不能添加删除子节点
public override void AddNode(ControlComponent con)
{
Console.WriteLine(
"叶类无法添加子节点。");
}

public override void RemoveNode(ControlComponent con)
{
Console.WriteLine(
"叶类无法移出子节点。");
}

//显示子节点信息的方法
public override void ShowNodeInfo()
{
Console.WriteLine(
"___控件名:" + ControlName + " 控件宽度:" + Width + " 控件高度:" + Height + " 控件允许输入:" + AllowInputNum);
}
}
复制代码

        三、组合类角色(Composite)

复制代码
   //组合类:Composite(主干类)
class ControlComposite : ControlComponent
{
//子节点的容器(可以是叶节点,叶可以是下一节主干)
private List<ControlComponent> controlList = new List<ControlComponent>();

//添加和删除子节点
public override void AddNode(ControlComponent con)
{
controlList.Add(con);
}

public override void RemoveNode(ControlComponent con)
{
controlList.Remove(con);
}

//显示子节点
public override void ShowNodeInfo()
{
Console.WriteLine(
"控件名:" + ControlName + " 控件宽度:" + Width + " 控件高度:" + Height + " 控件允许输入:" + AllowInputNum);
//递归显示其子节点树
foreach (ControlComponent c in controlList)
{
c.ShowNodeInfo();
}
}
}
复制代码

        四、客户端角色(Client)

复制代码
    //客户端:Client
class Program
{
static void Main(string[] args)
{
ControlComposite controlLayout
= new ControlComposite() { ControlName = "Layout", Height = 300, Width = 300 };
controlLayout.AddNode(
new ControlLeaf() { ControlName = "___TextBox", Height = 30, Width = 180, AllowInputNum = 50 });
controlLayout.AddNode(
new ControlLeaf() { ControlName = "___RichTextBox", Height = 35, Width = 220, AllowInputNum = 1000 });
controlLayout.AddNode(
new ControlLeaf() { ControlName = "___RadioButton", Height = 25, Width = 300, AllowInputNum = 1 });

ControlComposite complexControl
= new ControlComposite() { ControlName = "complex", Height = 96, Width = 300 };
complexControl.AddNode(
new ControlLeaf() { ControlName = "___RadioButtonA", Height = 33, Width = 180, AllowInputNum = 50 });
complexControl.AddNode(
new ControlLeaf() { ControlName = "___ComboBoxB", Height = 33, Width = 100 });
complexControl.AddNode(
new ControlLeaf() { ControlName = "___TextBoxC", Height = 30, Width = 100 });

controlLayout.AddNode(complexControl);
// controlLayout.RemoveNode(complexControl);

controlLayout.ShowNodeInfo();

Console.ReadLine();
}
}
复制代码

        如需源码请点击 CompositePattern.rar 下载。



相关文章
|
6月前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 组合模式
js设计模式【详解】—— 组合模式
67 7
|
4月前
|
设计模式 Java
Java设计模式:组合模式的介绍及代码演示
组合模式是一种结构型设计模式,用于将多个对象组织成树形结构,并统一处理所有对象。例如,统计公司总人数时,可先统计各部门人数再求和。该模式包括一个通用接口、表示节点的类及其实现类。通过树形结构和节点的通用方法,组合模式使程序更易扩展和维护。
Java设计模式:组合模式的介绍及代码演示
|
4月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
4月前
|
设计模式 存储 安全
Java设计模式-组合模式(13)
Java设计模式-组合模式(13)
|
4月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
6月前
|
设计模式
对抗软件复杂度问题之组合(Composite)方法设计模式是什么,如何解决
对抗软件复杂度问题之组合(Composite)方法设计模式是什么,如何解决
|
7月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
8月前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
|
7月前
|
设计模式 存储 安全
Java设计模式:组合模式之透明与安全的两种实现(七)
Java设计模式:组合模式之透明与安全的两种实现(七)
|
7月前
|
设计模式 Java
Java设计模式之组合模式详解
Java设计模式之组合模式详解