(2) Patrón estructural: 4. Patrón compuesto (ejemplo de C++)

Tabla de contenido

1. Significado del patrón compuesto

2. Escenarios de aplicación del modo combinado

3. Ventajas y desventajas del modelo combinado

4. Aprendizaje del diagrama UML del modo combinado

5. Un ejemplo sencillo de implementación del modo combinado en C++ (el sistema OA de la empresa)


1. Significado del patrón compuesto

El patrón compuesto, también llamado patrón parte-todo, se utiliza para tratar un grupo de objetos similares como un solo objeto. El modo de composición combina objetos según una estructura de árbol, que se utiliza para representar jerarquías parciales y totales. Este tipo de patrón de diseño es un patrón estructural que crea una estructura de árbol de grupos de objetos.


Componga objetos en estructuras de árbol para representar jerarquías de parte y todo. Composite permite a los clientes tratar objetos individuales y composiciones de objetos de manera uniforme. (De "Zen de los patrones de diseño")

2. Escenarios de aplicación del modo combinado

(1) Cuando encuentre que los requisitos reflejan la estructura jerárquica de partes y totalidades, como sistemas de archivos, árboles de vistas, estructuras organizativas de la empresa, etc.;

(2) Cuando espera que los usuarios puedan ignorar la diferencia entre objetos combinados y objetos individuales y usar todos los objetos en la estructura combinada de manera uniforme, puede considerar el modo combinado;

3. Ventajas y desventajas del modelo combinado

(1) Ventajas:

1) Simplificar el código del cliente : el modo combinado permite al cliente tratar objetos individuales y objetos compuestos de manera uniforme sin distinguir sus tipos, simplificando así el código del cliente.

2) Flexibilidad y escalabilidad : a través del modo combinado, la estructura de los objetos se puede agregar, eliminar y modificar dinámicamente, lo que hace que el sistema sea más flexible y fácil de expandir.

3) Interfaz de operación unificada : el modo combinado define una interfaz de operación unificada, que permite al cliente procesar objetos individuales y objetos combinados de manera consistente sin preocuparse por el tipo de objetos específicos.

4) Cree cómodamente estructuras de objetos complejas : el modo de combinación puede organizar objetos en una estructura de árbol, lo que facilita la creación y gestión de estructuras de objetos complejas.

(2) Desventajas:

1) Mayor complejidad del diseño : el uso del patrón combinado introducirá más clases y objetos, lo que aumentará la complejidad del diseño del sistema. Esto puede dar como resultado una estructura de código compleja que es difícil de entender y mantener.

2) No apto para todos los escenarios : el modo combinado es adecuado para situaciones en las que se representan jerarquías de partes enteras, pero no todas las situaciones son adecuadas para utilizar el modo combinado. Si no existe una relación jerárquica obvia entre los objetos o no es necesario tratar los objetos individuales y los objetos compuestos de manera uniforme, entonces el uso del patrón de composición puede generar una complejidad innecesaria.

3) Dificultad para restringir los tipos de componentes : en el modo de composición, los objetos de composición pueden contener otros objetos de composición u objetos de hoja. Esto significa que es difícil imponer restricciones de tipo a los componentes en tiempo de compilación, lo que puede provocar algunos errores de tiempo de ejecución.

4) Posible pérdida de rendimiento : dado que el modo combinado implica atravesar recursivamente todo el árbol de objetos, puede causar cierta pérdida de rendimiento. Especialmente cuando el árbol de objetos es muy grande, la operación transversal puede consumir más tiempo y recursos.

Aunque el patrón de composición tiene algunas desventajas, sigue siendo un patrón de diseño potente y de uso común, especialmente adecuado para escenarios en los que es necesario tratar con estructuras jerárquicas. Al utilizar el patrón de composición, debe sopesar sus ventajas y desventajas según sus necesidades específicas y el diseño del sistema, y ​​asegurarse de que el patrón se aplique correctamente.

4. Aprendizaje del diagrama UML del modo combinado

Elementos de composición:

(1) Rol del componente abstracto (Compuesto): es la interfaz de declaración de los objetos en la composición e implementa el comportamiento predeterminado de la interfaz común a todas las clases.

(2) Función del componente hoja (Hoja): el objeto único mencionado anteriormente, el nodo hoja no tiene nodos secundarios.

(3) Función del componente de rama (compuesto): define el comportamiento del componente compuesto con subcomponentes, almacena los subcomponentes e implementa operaciones relacionadas con los subcomponentes en la interfaz del componente.

(4) Cliente (Cliente): objeto que utiliza componentes Componente.

5. Un ejemplo sencillo de implementación del modo combinado en C++ (el sistema OA de la empresa)

#include <iostream>
#include <string>
#include <vector>

// 组件接口
class Component 
{
public:
	virtual void display() const = 0;
};

// 叶子对象:员工
class Employee : public Component 
{
private:
	std::string name;

public:
	Employee(const std::string& name) : name(name) {}

	void display() const override 
	{
		std::cout << "Employee: " << name << std::endl;
	}
};

// 组合对象:部门
class Department : public Component 
{
private:
	std::string name;
	std::vector<Component*> members;

public:
	Department(const std::string& name) : name(name) {}

	void add(Component* member) 
	{
		members.push_back(member);
	}

	void remove(Component* member) 
	{
		// 在实际应用中可能需要更复杂的逻辑来删除成员
		members.erase(std::remove(members.begin(), members.end(), member), members.end());
	}

	void display() const override 
	{
		std::cout << "Department: " << name << std::endl;
		for (const auto& member : members) 
		{
			member->display();
		}
	}
};

int main() 
{
	// 创建公司的组织结构
	Department company("Company");

	Department department1("Department 1");
	Employee employee1("Employee 1");
	Employee employee2("Employee 2");

	Department department2("Department 2");
	Employee employee3("Employee 3");
	Employee employee4("Employee 4");

	// 构建组织结构
	company.add(&department1);
	company.add(&department2);

	department1.add(&employee1);
	department1.add(&employee2);

	department2.add(&employee3);
	department2.add(&employee4);

	// 显示公司的组织结构
	company.display();

	return 0;
}

En el ejemplo anterior, creamos una interfaz Componente como clase base del componente, que contiene un método de visualización. La clase Empleado representa objetos hoja y la clase Departamento representa objetos compuestos. Se utiliza un vector en la clase Departamento para almacenar miembros.

En la función principal, creamos un objeto de empresa empresa y dos objetos de departamento departamento1 y departamento2, así como cuatro objetos de empleado empleado1, empleado2, empleado3 y empleado4. Luego, agregue departamentos y empleados a la estructura organizativa de la empresa. Finalmente, llamar al método de visualización de la empresa mostrará de forma recursiva la estructura organizativa de toda la empresa.

Al ejecutar el código anterior, el resultado será:

Departamento: Empresa

Departamento: Departamento 1

Empleado: Empleado 1

Empleado: Empleado 2

Departamento: Departamento 2

Empleado: Empleado 3

Empleado: Empleado 4

Como puede ver, el método de visualización del objeto compuesto llama con éxito al método de visualización de todos los subcomponentes de forma recursiva, mostrando así la estructura organizativa de la empresa.

A través del modo combinado podemos gestionar y operar la estructura organizativa de la empresa de forma unificada, simplificando así el uso y mantenimiento del código.

Supongo que te gusta

Origin blog.csdn.net/bigger_belief/article/details/132299051
Recomendado
Clasificación