設計模式(十九)——數據結構模式-Composite

對象模式所屬類別簡介

有些組件在內部具有特定的數據結構,如果讓客戶程序依賴這些特定的數據結構,將極大地破壞組件的複用。這時候,將這個特定數據結構封裝在內部,在外部提供統一的接口,來實現與特定數據結構無關的訪問,是一種行之有效的解決方案。
包括Composite、Iterator、Chain of Resposibility

當前模式簡介動機

Composite組件模式——將代碼與複雜的對象容器結構分開。

需求

完成一棵樹,樹有節點和主幹。父主幹一個,多個子主幹,主幹上有葉子節點。

設計一

需求更改

設計一更改版本

違反原則

設計二

#include "stdafx.h"
#include <iostream>
#include <list>
using namespace std;

class Component
{
public:
	virtual void process()=0;
};

class Composite : public Component
{
	list<Component*> m_list;
public:
	void add(Component* m){ m_list.push_back(m); }
	void del(Component* m){ m_list.remove(m); }
	void process()
	{
		std::cout << "Composite" << std::endl;
		for (list<Component*>::iterator ite = m_list.begin(); ite != m_list.end(); ite++)
		{
			(*ite)->process();
		}
	}
};

class Leaf : public Component
{
public:
	void process()
	{
		std::cout << "LEAF" << std::endl;
	}
};


void Invoke(Component & c){
	//...
	c.process();
	//...
}

int main()
{
	Composite root;
	
	Composite r1;
	Composite r2;

	root.add(&r1);
	root.add(&r2);

	Leaf l1;
	Leaf l2;
	r1.add(&l1);
	r1.add(&l2);
	root.process();
	return 0;
}
//打印 root-》r1->l1->l2->r2
Composite
Composite
LEAF
LEAF
Composite

設計二更改版本

設計二比設計一區別

模式定義

將對象組合成樹形結構以表示 部分-整體的層次結構。Composite使得用戶對單個對象和組合對象的使用具有一致性(穩定)

模式結構

在這裏插入圖片描述

要點總結

將一對多關係轉爲一對一關係。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章