设计模式:22 手机软件何时统一_桥接模式

合成/聚合复用原则:尽量使用合成/聚合,尽量不要使用类继承

聚合:表示弱拥有关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。

合成:强拥有关系,体现严格的部分和整体的关系,部分和整体的声明周期一样。

实例:

大雁-----------<>雁群

<> 

|

|

翅膀

 

游戏,通讯录功能都是软件,让其分离与手机的耦合。

应该增加一个手机品牌抽象类和手机软件抽象类

手机品牌包含手机软件,但软件不是品牌的一部分,因此是聚合关系。

 

优点:优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样累和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。

原因:继承是一种强耦合的结构,父类变,子类就必须改变。

 

桥接模式:将抽象部分与它的实现部分分离,使他们都可以独立地变化。

实现指的是:抽象类和它的派生类用来实现自己的对象。

本质:实现方式有很多种,把实现独立出来,让它们各自地变化。

 设计模式:22 手机软件何时统一_桥接模式_第1张图片

本质:

实现系统可能有多角度分类,每一种分类都有可能变化,就把这种多角度分离出让它们独立变化,减少它们之间的耦合。

 

main.cpp

#include <iostream>
#include <stdlib.h>
#include <memory>
#include "PhoneSoft.h"
#include "PhoneBrand.h"

using namespace std;

void process()
{
	std::shared_ptr<PhoneBrand> ptrApple(new Apple());
	std::shared_ptr<PhoneBrand> ptrNokia(new Nokia());
	std::shared_ptr<PhoneSoft> ptrGame(new PhoneGame());
	std::shared_ptr<PhoneSoft> ptrAddressList(new PhoneAddressList());
	ptrApple->setPhoneSoft(ptrGame);
	ptrApple->run();
	ptrApple->setPhoneSoft(ptrAddressList);
	ptrApple->run();
}

int main(int argc,char* argv[])
{
	process();
	system("pause");
	return 0;
}


PhoneBrand.h

#ifndef PHONEBRAND_H
#define PHONEBRAND_H
#include <memory>
#include "PhoneSoft.h"
class PhoneBrand
{
public:
	PhoneBrand();
	virtual ~PhoneBrand(void);
	virtual void run() = 0;
	void setPhoneSoft(std::shared_ptr<PhoneSoft> ptrPhoneSoft);
protected:
	std::shared_ptr<PhoneSoft> _ptrPhoneSoft;
};

class Apple : public PhoneBrand
{
public:
	void run();
};

class Nokia : public PhoneBrand
{
public:
	void run();
};
#endif


PhoneBrand.cpp

#include "PhoneBrand.h"


PhoneBrand::PhoneBrand()
{
}


PhoneBrand::~PhoneBrand(void)
{
}

void PhoneBrand::setPhoneSoft(std::shared_ptr<PhoneSoft> ptrPhoneSoft)
{
	_ptrPhoneSoft = ptrPhoneSoft;
}

void Apple::run()
{
	_ptrPhoneSoft->run();
}

void Nokia::run()
{
	_ptrPhoneSoft->run();
}


PhoneSoft.h

#ifndef PHONESOFT_H
#define PHONESOFT_H
class PhoneSoft
{
public:
	PhoneSoft(void);
	virtual ~PhoneSoft(void);
	virtual void run();
};

class PhoneGame : public PhoneSoft
{
public:
	void run();
};

class PhoneAddressList : public PhoneSoft
{
public:
	void run();
};
#endif


PhoneSoft.cpp

#include "PhoneSoft.h"
#include <iostream>

using namespace std;

PhoneSoft::PhoneSoft(void)
{
}


PhoneSoft::~PhoneSoft(void)
{
}

void PhoneSoft::run()
{
}

void PhoneGame::run()
{
	cout << "运行手机游戏" << endl;
}

void PhoneAddressList::run()
{
	cout << "运行手机通讯录" << endl;
}




 

你可能感兴趣的:(桥接模式)