设计模式2—结构型模式

结构型模式用来处理类或者对象的组合,主要包含以下7种设计模式:

1. 代理模式(Proxy Pattern)就是为其他对象提供一种代理以控制对这个对象的访问。

2. 装饰者模式(Decorator Pattern)动态的给一个对象添加一些额外的职责。就增加功能来说,此模式比生成子类更为灵活。

3. 适配器模式(Adapter Pattern)是将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

4. 组合模式(Composite Pattern)是将对象组合成树形结构以表示“部分--整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性。

5. 桥接模式(Bridge Pattern)是将抽象部分与实际部分分离,使它们都可以独立的变化。

6. 外观模式(Facade Pattern)是为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

7. 享元模式(Flyweight Pattern)是以共享的方式高效的支持大量的细粒度的对象。

1. 代理模式

#include <iostream>
#include <stdlib.h>
using namespace std;

//////////////////////////////////////////////////////////////////////////
/*
	 为其他对象提供一种代理以控制对这个对象的访问。
	(就是把一个类注入到另一个类中,也就是作为参数,或者成员)
*/
//////////////////////////////////////////////////////////////////////////

class BookShop //书店
{
public:
	virtual ~BookShop()
	{
	}
	virtual void sailBook() = 0; //提供卖书接口
protected:
private:
};

class RealBookShop :public BookShop //实体书店
{
public:
	virtual void sailBook()
	{
		cout << "实体书店卖书" << endl;
	}
protected:
private:
};

//////////////////////////////////////////////////////////////////////////
/*
	实现方法1 	没有继承父类
*/
class DangDangProxy //当当网代理卖书,也卖其他的东西
{
public:
	~DangDangProxy()
	{
		delete book;
		book = NULL;
	}
	void sailBook()
	{
		book = new RealBookShop; //通过父类的指针来调用子类的方法.
		book->sailBook();
		sailShose();
	}
	void sailShose()
	{
		cout << "代理卖鞋" << endl;
	}
protected:
private:
	BookShop *book;
};

//////////////////////////////////////////////////////////////////////////
/*
	实现方法2		继承父类
	继承父类,可以实现通过父类的指针或者引用来调用子类的方法,
*/
class TaoBao :public BookShop
{
public:
	~TaoBao()
	{
		delete book;
		book = NULL;
	}
	virtual void sailBook()
	{
		book = new RealBookShop; //通过父类的指针来调用子类的方法.
		dazhe();
		book->sailBook();
		dazhe();
	}
	void dazhe()
	{
		cout << "节日打折" << endl;
	}
protected:
private:
	BookShop *book;
};

//////////////////////////////////////////////////////////////////////////
/*
                      cocos2d 就是使用代理模式
*/
//////////////////////////////////////////////////////////////////////////
class Protocol
{
public:
	virtual bool applicationDidFinish() = 0;
protected:
private:
};

class Application :public Protocol
{
public:
	Application();
	int run();
	static Application *pointerApp;
	static Application* getPointerApp();
protected:
private:
};
Application* Application::pointerApp = NULL; //静态变量初始化
Application::Application() //构造函数
{
	pointerApp = this;//静态变量赋值
}
Application* Application::getPointerApp()
{
	return pointerApp;
}
int Application::run()
{
	applicationDidFinish();
	return 0;
}

class AppDelegate : private Application  //注意是private继承
{
public:
	virtual bool applicationDidFinish();
protected:
private:
};
bool AppDelegate::applicationDidFinish()
{
	cout << "start game" << endl;
	return true;
}

int main()
{
	cout << "-----------DangDang------------" << endl;
	DangDangProxy dangdang;
	dangdang.sailBook();

	cout << "-----------TaoBao------------" << endl;
	BookShop* book = new TaoBao;
	book->sailBook();
	delete book;

	cout << "------------coco2d 入口函数分析------------" << endl;
	AppDelegate appdelete;
	Application::getPointerApp()->run();

	system("pause");
	return 0;
}

2. 装饰者模式

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

//////////////////////////////////////////////////////////////////////////
/*
    装饰( Decorator )模式又叫做包装模式。
    通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案。

    装饰模式就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,
    当需要执行时,客户端就可以有选择地、按顺序地使用装饰功能包装对象。

    其实就是在一个类中声明一个父类的指针,通过父类的指针指向另外一个子类,并调用那个子类的函数
*/
//////////////////////////////////////////////////////////////////////////

class Car //汽车
{
public:
    virtual void show() = 0;
    virtual ~Car(){}
protected:
private:
};

class RunCar : public Car //跑车
{
public:
    RunCar(Car* car = NULL)
    {
        this->m_car = car;
    }
    ~RunCar()
    {
        delete m_car;
        m_car = NULL;
    }
    virtual void show()
    {
        if (m_car != NULL)m_car->show();
        run();
    }
    void run()
    {
        cout << "可以跑" << endl;
    }
protected:
private:
    Car *m_car;
};

class SwimCar : public Car
{
public:
    SwimCar(Car *car=NULL)
    {
        this->m_car = car;
    }
    ~SwimCar()
    {
        delete m_car;
        m_car = NULL;
    }
    void swim()
    {
        cout << "会游泳" << endl;
    }
    virtual void show()
    {
        if (m_car!=NULL)m_car->show();
        swim();
    }
protected:
private:
    Car *m_car;
};

class FlyCar : public Car
{
public:
    FlyCar(Car *car)
    {
        this->m_car = car;
    }
    ~FlyCar()
    {
        delete m_car;
        m_car = NULL;
    }
    void fly()
    {
        cout << "会飞行" << endl;
    }
    virtual void show()
    {
        if (this->m_car != NULL)m_car->show();
        fly();
    }
protected:
private:
    Car *m_car;
};

int main()
{

    Car* myCar = NULL;
    myCar = new RunCar;
    myCar->show();
    cout << "--------------------" << endl;

    FlyCar* flyCar = new FlyCar(myCar);
    flyCar->show();
    cout << "--------------------" << endl;

    SwimCar *swimCar = new SwimCar(flyCar);
    swimCar->show();
    system("pause");

    delete swimCar; swimCar = NULL;
    delete flyCar; flyCar = NULL;
    delete myCar; myCar = NULL;
    return 0;
}

3. 适配器模式

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

//////////////////////////////////////////////////////////////////////////
/*

    Adapter模式也叫适配器模式,是构造型模式之一,通过Adapter模式可以改变已有类(或外部类)的接口形式。

    适用于:
    是将一个类的接口转换成客户希望的另外一个接口。
    使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

    220v 电压  <----相互适配---->  110v 电压
*/
//////////////////////////////////////////////////////////////////////////
class DianYa
{
public:
protected:
    int v; //扩展:可以使用v表示电压,改变v的值
};

class Current220V :virtual public DianYa
{
public:
    virtual void use220V()
    {
        cout << "220V 电压" << endl;
    }
protected:
private:
};

class Current110V : virtual public DianYa
{
public:
    virtual void use110V()
    {
        cout << "110V 电压" << endl;
    }
protected:
private:
};

class Adapter : public Current110V, public Current220V
{
public:
    Adapter()
    {
        m_110V = NULL;
        m_220V = NULL;
    }
    Adapter(Current110V* m_110V)
    {
        this->m_110V = m_110V;
    }
    Adapter(Current220V* m_220V)
    {
        this->m_220V = m_220V;
    }
    virtual void use110V()
    {
        if (m_220V != NULL)
        {
            cout << "适配器 适配 220V" << endl;
            m_220V->use220V();
        }
        else cout << "110V" << endl;
    }
    virtual void use220V()
    {
        if (m_110V != NULL)
        {
            cout << "适配器 适配 110V" << endl;
            m_110V->use110V();
        }
        else cout << "220V" << endl;
    }
protected:
private:
    Current110V* m_110V;
    Current220V* m_220V;
};

int main()
{
    Current110V* current110V=new Current110V;
    Current220V* current220V=new Current220V;
    Adapter* adap = NULL;

    adap = new Adapter(current110V); //输入110V
    adap->use220V(); //经适配器后,输出220V
    delete adap; adap = NULL;

    adap = new Adapter(current220V); //输入220V
    adap->use110V(); //经适配器后,输出110V
    delete adap; adap = NULL;

    delete current220V; current220V = NULL;
    delete current110V; current110V = NULL;

    system("pause");
    return 0;
}

4. 组合模式

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <list>
#include <string>
using namespace std;

//////////////////////////////////////////////////////////////////////////
/*
Composite模式也叫组合模式,是构造型的设计模式之一。
通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树。
*/
//////////////////////////////////////////////////////////////////////////

class IFile
{
public:
	virtual void disPaly() = 0;
	virtual int add(IFile *ifile) = 0;
	virtual int remove(IFile* ifile) = 0;
	virtual list<IFile*>* getChild() = 0;
protected:
private:
};

//文件  节点
class File : public IFile
{
public:
	File(string filename)
	{
		this->m_filename = filename;
	}
	virtual void disPaly()
	{
		cout << "文件名:" << m_filename << endl;
	}
	virtual int add(IFile *ifile)
	{
		return -1;
	}
	virtual int remove(IFile* ifile)
	{
		return -1;
	}
	virtual list<IFile*>* getChild()
	{
		return NULL;
	}
protected:
private:
	string m_filename;
};

//目录  节点
class Dir : public IFile
{
public:
	Dir(string dirName)
	{
		this->m_dirName = dirName;
		this->m_list = new list < IFile* > ;
		m_list->clear();
	}
	virtual void disPaly()
	{
		cout << "文件夹名:" << m_dirName << endl;
	}
	virtual int add(IFile *ifile)
	{
		m_list->push_back(ifile);
		return 0;
	}
	virtual int remove(IFile* ifile)
	{
		m_list->remove(ifile);
		return 0;
	}
	virtual list<IFile*>* getChild()
	{
		return m_list;
	}
protected:
private:
	string m_dirName;
	list<IFile*>* m_list;
};

// level用来控制显示层次结构
void showTree(IFile* root,int level)
{
	int i = 0;
	if (root == NULL)return;
	for (i = 0; i < level; i++)cout << "\t";
	root->disPaly(); //显示根节点

	//2  若根结点 有孩子
	//判读孩子是文件,显示名字 )
	//判断孩子是目录,showTree(子目录)
	list<IFile*> *myList = root->getChild();
	if (myList != NULL) //说明是一个目录
	{
		for (list<IFile*>::iterator it = myList->begin(); it != myList->end();it++)
		{
			if ((*it)->getChild() == NULL) //文件直接打印
			{
				for (i = 0; i <= level; i++) //注意 <=
				{
					printf("\t");
				}
				(*it)->disPaly();
			}
			else
			{
				//目录再递归调用,层次加1
				showTree(*it, level+1);
			}
		}
	}
}

int main()
{

	Dir* root = new Dir("C");
	root->disPaly();

	File *fileAAA = new File("aaa.txt");
	File *fileBBB = new File("bbb.txt");
	File *fileCCC = new File("ccc.txt");

	Dir *dir001 = new Dir("001");
	Dir *dir002 = new Dir("002");
	Dir* dir003 = new Dir("003");

	root->add(dir001);
	root->add(dir002);
	root->add(fileAAA);
	dir002->add(dir003);
	dir002->add(fileBBB);
	dir003->add(fileCCC);

	list<IFile*>* myList = root->getChild();
	for (list<IFile *>::iterator it = myList->begin(); it != myList->end(); it++)
	{
		(*it)->disPaly();
	}

	cout << "通过 showTree 方式 显示 root 结点下的 所有子结点" << endl;
	showTree(root, 0);

	system("pause");
	return 0;
}

5. 桥接模式

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

//////////////////////////////////////////////////////////////////////////
/*
		桥接模式 : 就是多对多的关系;
	发动机有多种型号,汽车也有多个品牌
	每个型号的发动机可以被各个型号的汽车使用
	每个品牌的汽车也可以使用各个型号的发动机

	等于在中间架设一座桥,(在抽象类中声明另一个抽象类的指针,用来调用另一个抽象类子类的方法)
*/
//////////////////////////////////////////////////////////////////////////

class Car; //前向声明
class Engine
{
public:
	virtual void engineType() = 0;
protected:
	Car* car;
private:
};

class Type2900 :public Engine
{
public:
	virtual void engineType()
	{
		cout << "2900 型号发动机" << endl;
	}
protected:
private:
};

class Type3500 :public Engine
{
public:
	virtual void engineType()
	{
		cout << "3500 型号发动机" << endl;
	}
protected:
private:
};

class Type7200 :public Engine
{
public:
	virtual void engineType()
	{
		cout << "7200 型号发动机" << endl;
	}
protected:
private:
};

class Car
{
public:
	virtual void carType() = 0;
	Car(Engine* engine)
	{
		this->m_engine = engine;
	}
protected:
	Engine *m_engine;
private:
};

class BMW : public Car
{
public:
	BMW(Engine* engine) :Car(engine){}
	virtual void carType()
	{
		cout << "BMW Car: ";
		m_engine->engineType();
	}
protected:
private:
};

class Jeep : public Car
{
public:
	Jeep(Engine* engine) :Car(engine){}
	virtual void carType()
	{
		cout << "Jeep Car: ";
		m_engine->engineType();
	}
protected:
private:

};

int main()
{
	Engine	*engine = NULL;
	Car* car = NULL;

	engine = new Type2900;
	car = new BMW(engine);
	car->carType();
	delete car; car = NULL;
	delete engine; engine = NULL;

	engine = new Type3500;
	car = new BMW(engine);
	car->carType();
	delete car; car = NULL;
	delete engine; engine = NULL;

	engine = new Type3500;
	car = new Jeep(engine);
	car->carType();
	delete car; car = NULL;
	delete engine; engine = NULL;

	system("pause");
	return 0;
}

6. 外观模式

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;

//////////////////////////////////////////////////////////////////////////
/*
		外观模式就是封装了一层外壳,提供统一的操作界面
		也就是把“操作相似的类” 注入到另一个类里面,提供统一操作
*/
//////////////////////////////////////////////////////////////////////////

class SubSystemA
{
public:
	void doSomething()
	{
		cout << "SubSystemA run" << endl;
	}
protected:
private:
};

class SubSystemB
{
public:
	void doSomething()
	{
		cout << "SubSystemB run" << endl;
	}
protected:
private:
};

class SubSystemC
{
public:
	void doSomething()
	{
		cout << "SubSystemC run" << endl;
	}
protected:
private:
};

class Facade
{
public:
	Facade()
	{
		sysA = new SubSystemA;
		sysB = new SubSystemB;
		sysC = new SubSystemC;
	}
	~Facade()
	{
		delete sysA;
		delete sysB;
		delete sysC;
	}
	void doSomething()
	{
		sysA->doSomething();
		sysB->doSomething();
		sysC->doSomething();
	}
protected:
private:
	SubSystemA *sysA;
	SubSystemB *sysB;
	SubSystemC *sysC;
};

int main()
{
	cout << "没有Facade类时的调用方式" << endl;
	SubSystemA *sysA = new SubSystemA;
	SubSystemB *sysB = new SubSystemB;
	SubSystemC *sysC = new SubSystemC;

	sysA->doSomething();
	sysB->doSomething();
	sysC->doSomething();
	delete sysA;
	delete sysB;
	delete sysC;

	cout << "使用Facade类的调用方式" << endl;
	Facade *f = new Facade;
	f->doSomething();
	delete f;
	system("pause");
}

7. 享元模式

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <map>
#include <string>
using namespace std;

//////////////////////////////////////////////////////////////////////////
/*
	Flyweight模式也叫享元模式,是构造型模式之一,
	它通过与其他类似对象共享数据来减小内存占用。

	所谓的享元模式“就是有相同的不用管,没有相同的继续添加”。
	只需要在添加的时候判断下有没有相同的。
*/
//////////////////////////////////////////////////////////////////////////

class Person
{
public:
	Person(string name, int age) :m_name(name), m_age(age){}
	virtual void printT() = 0;
protected:
	string m_name;
	int m_age;
private:
};

class Teacher : public Person
{
public:
	Teacher(string name, int age, string id) :Person(name, age),m_id(id){}
	virtual void printT()
	{
		cout << "name:" << m_name << " age:" << m_age << " m_id:" << m_id << endl;
	}
protected:
private:
	string m_id;
};

class FlyWeightTeacher
{
public:
	FlyWeightTeacher()
	{
		mapTeachers.clear();
	}
	~FlyWeightTeacher()
	{
		while (!mapTeachers.empty())
		{
			Person *tmp = NULL;
			map<string, Person *>::iterator it = mapTeachers.begin();
			tmp = it->second;
			mapTeachers.erase(it); //把第一个结点 从容器中删除
			delete tmp;
		}
	}
	Person* getTeacher(string id)
	{
		Person* tmp = NULL;
		map<string, Person*>::iterator it;
		it = mapTeachers.find(id);
		if (it == mapTeachers.end()) //没有找到
		{
			string tmpName;
			int tmpAge;
			cout << "\n输入老师的Name:";
			cin >> tmpName;
			cout << "\n输入老师的Age:";
			cin >> tmpAge;

			tmp = new Teacher(tmpName,tmpAge,id);
			mapTeachers.insert(pair<string,Person*>(id,tmp));
		}
		else
		{
			tmp = it->second;
		}
		return tmp;
	}
protected:
private:
	map<string, Person*> mapTeachers;
};

int main()
{
	Person *p1 = NULL;
	Person *p2 = NULL;

	FlyWeightTeacher * fwty = new FlyWeightTeacher;
	p1->printT();

	p2 = fwty->getTeacher("001");
	p2->printT();

	delete fwty;

	system("pause");
	return 0;
}

时间: 2024-11-08 17:20:45

设计模式2—结构型模式的相关文章

设计模式4 结构型模式

设计模式4  结构型模式 目录 代理模式 装饰器 外观模式 适配器模式 代理模式,美国,韩国代理购物 [email protected]:~$ cat main.cpp  #include<iostream> using namespace std; class Item //商品 { public: Item(string kind ,bool fact) { this->kind = kind; this->fact = fact; } string getKind() { r

Java经典23种设计模式之结构型模式(二)

接上篇,本文介绍结构型模式里的组合模式.装饰模式.外观模式. 一.组合模式(Composite) 组合模式:将对象组合成树形结构,表示"部分--整体"的层次结构.最终达到单个对象和组合对象的使用具有一致性.单看这句话貌似有点抽象,其实比较简单. 以李云龙的独立团为例,目的要统计赵嘉宇一战共歼灭敌人多少个.最高的级别是团,一个团有若干个营,一个营有若干个排,一个排有若干个战士.(为了简化问题,排下面就不设行政单位了).很自然的,李云龙给营长开会回去给老子统计.营长回去给各个排长开会,赶紧

一起学java设计模式--适配器模式(结构型模式)

适配器模式 现有一个接口DataOperation定义了排序方法sort(int[]) 和查找方法search(int[], int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法,类BinarySearch 的binarySearch(int[], int)方法实现了二分查找算法.现使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch的方法适配到DataOperation接口中.绘制类图并编程实现. (要求实现

《设计模式》结构型模式1

上篇博文写了创建型模式中的(工厂家族).这次来介绍一下结构型模式.主要从各个模式的含义,优缺点,适用场合及结构图来了解结构型模式. 结构型模式包括有7种模式,适配器模式,外观模式,代理模式,桥接模式,享元模式,组合模式,装饰模式.每个模式各有优缺,孰优孰劣,请看下文. 1.适配器模式 定义:将一个类的接口转换成客户希望的另外一个接口.使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 结构图: 适用于:想要使用一个已存在的类,但接口和你的要求不同时 在软件开发后期或是维护时期,在双方都不

设计模式总结-结构型模式

描述: 如何组合类和对象以获得最大的结构: 不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法: 分类: 适配器模式 http://blog.csdn.net/huo065000/article/details/22177651 装饰模式 http://blog.csdn.net/huo065000/article/details/22061403 代理模式 http://blog.csdn.net/huo065000/article/details/22177

Java经典23种设计模式之结构型模式(三)------附代理模式、适配器模式、外观模式区别

本文介绍7种结构型模式里的剩下两种:享元模式.代理模式. 一.享元模式FlyWeight 享元模式比较简单且重要,在很多场合都被用到,只不过封装起来了用户看不到.其概念:运用共享内存技术最大限度的支持大量细粒度的对象.这个概念给的有些抽象,说白了就是如果内存中存在某个对象A,如果再次需要使用对象A的时候如果内存中有A这个对象就直接使用它,不要再次new了.如果没有,则重新new一个.基于这个特点,享元模式使用时一般会给待访问对象传递一个Tag,用来标识这个对象,而且要同时使用抽象工厂的方法进行访

Java经典23种设计模式之结构型模式(一)

结构型模式包括7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式其实很简单,就像手机充电器一样,手机需要5V的,而插座出来是220V.因此需要充电器变压就ok.再比如,一个之会说汉语的和一个只会说英语的无法沟通,那就中间请个翻译.所有的交流通过翻译,翻译翻给会说英语的,就能完成一次单项交流的.链接1 中的例子非常生动形象了.总结一下,无非就是有个通用的接口(称为Target),如果一切顺

Java学习--设计模式之结构型模式(二)

一.装饰器模式(Decorator Pattern) 1.概念 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 2.简介 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活. 主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引

设计模式(27)-----结构型模式-----过滤器模式

过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来.这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准. 实现 我们将创建一个 Person 对象.Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列表.CriteriaPatternDemo,我们的演示类使用 Criteria 对象,基于各种标准和它们的结合来过滤 Pe

设计模式(28)-----结构型模式-----享元模式

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象.我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式.由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象.这里只有5个对象的. 介绍 意图:运用共享技术有效地支持大量细粒度的对象. 主