设计模式 之 Bridge,Adapter,Decorator,Composite,Proxy

Bridge Pattern

问题:

在面向对象中,代码结构设计的目标就是“松耦合,高内聚”,尽可能提高系统模块的内部的内聚,尽可能降低模块之间的耦合;有一个对应的原则是 “Favor Composition Over Inheritance”;

方案:

Bridge模式可以实现固定工作流和具体实现解耦,一般有两个类,一个Abstraction,含有一个似有指针成员指向AbstractionImp对象,而另一个AbstractionImp类封装具体的实现细节,在需求发生频繁变动的开发中,具有明显的优势。
也可以解除编译依赖 编码规范
在这里插入图片描述

Code:
//Abstraction.h
#ifndef _ABSTRACTION_H_
#define _ABSTRACTION_H_
class AbstractionImp;
class Abstraction
{
public:
	virtual ~Abstraction();
	virtual void Operation() = 0;
protected:
	Abstraction();
private:
};

class RefinedAbstraction:public Abstraction
{
public:
	RefinedAbstraction(AbstractionImp* imp);
	~RefinedAbstraction();
	void Operation();
protected:
private:
	AbstractionImp* _imp;
};
#endif //~_ABSTRACTION_H_
//Abstraction.cpp
#include "Abstraction.h"
#include "AbstractionImp.h"
#include <iostream>
using namespace std;
Abstraction::Abstraction()
{
}
Abstraction::~Abstraction()
{
}
RefinedAbstraction::RefinedAbstraction(AbstractionImp* imp)
{
	_imp = imp;
}
RefinedAbstraction::~RefinedAbstraction()
{
}
void RefinedAbstraction::Operation()
{
	_imp->Operation();
}
//AbstractionImp.h
#ifndef _ABSTRACTIONIMP_H_
#define _ABSTRACTIONIMP_H_
class AbstractionImp
{
public:
	virtual ~AbstractionImp();
	virtual void Operation() = 0;
protected:
	AbstractionImp();
private:
};
class ConcreteAbstractionImpA:public AbstractionImp
{
public:
	ConcreteAbstractionImpA();
	~ConcreteAbstractionImpA();
	virtual void Operation();
protected:
private:
};
class ConcreteAbstractionImpB:public AbstractionImp
{
public:
	ConcreteAbstractionImpB();
	~ConcreteAbstractionImpB();
	virtual void Operation();
protected:
private:
};
#endif //~_ABSTRACTIONIMP_H_
//AbstractionImp.cpp
#include "AbstractionImp.h"
#include <iostream>
using namespace std;
AbstractionImp::AbstractionImp()
{
}
AbstractionImp::~AbstractionImp()
{
}
void AbstractionImp::Operation()
{
	cout<<"AbstractionImp....imp..."<<endl;
}
ConcreteAbstractionImpA::ConcreteAbstractionImpA()
{
}
ConcreteAbstractionImpA::~ConcreteAbstractionImpA()
{
}
void ConcreteAbstractionImpA::Operation()
{
	cout<<"ConcreteAbstractionImpA...."<<endl;
}
ConcreteAbstractionImpB::ConcreteAbstractionImpB()
{
}
ConcreteAbstractionImpB::~ConcreteAbstractionImpB()
{
}
void ConcreteAbstractionImpB::Operation()
{
	cout<<"ConcreteAbstractionImpB...."<<endl;
}
//main.cpp
#include "Abstraction.h"
#include "AbstractionImp.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
	AbstractionImp* imp = new ConcreteAbstractionImpA();
	Abstraction* abs = new RefinedAbstraction(imp);
	abs->Operation();
	return 0;
}

Adapter Pattern

问题:

开发过程中,需要不同模块之间相互配合工作,但是当别的团队或者购买的第三方模块设计的对外接口和自己开发模块的接口不一致,在不同的接口之间作兼容?

方案:

Client想要调用目标类的request方法,但是Adaptee对象提供了SpecificRequest方法,所以Adapter需要处理之间的接口不一致情形。
方法1:类模式
使用继承的方法,让Adapter继承Adaptee类,封装方法,让client调用;
在这里插入图片描述
方法2:对象模式
类之间为组合的关系,让Adapter去持有Adpatee成员并调用SpecificRequest的方法并对外公开Request接口即可。
在这里插入图片描述

code:

类模式:

//Adapter.h
#ifndef _ADAPTER_H_
#define _ADAPTER_H_
class Target
{
public:
Target();
virtual ~Target();
virtual void Request();
protected:
private:
};
class Adaptee
{
public:
Adaptee();
~Adaptee();
void SpecificRequest();
protected:
private:
};
class Adapter:public Target,private Adaptee
{
	public:
	Adapter();
	~Adapter();
	void Request();
	protected:
	private:
};
#endif //~_ADAPTER_H_
//Adapter.cpp
#include "Adapter.h"
#include <iostream>
Target::Target()
{
}
Target::~Target()
{
}
void Target::Request()
{
	std::cout<<"Target::Request"<<std::endl;
}
Adaptee::Adaptee()
{
}
Adaptee::~Adaptee()
{
}
void Adaptee::SpecificRequest()
{
	std::cout<<"Adaptee::SpecificRequest"<<std::endl;
}
Adapter::Adapter()
{
}
Adapter::~Adapter()
{
}
void Adapter::Request()
{
	this->SpecificRequest();
}
//main.cpp
#include "Adapter.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
	//Adapter* adt = new Adapter();
	Target* adt = new Adapter();
	adt->Request();
	return 0;
}

对象模式:

//Adapter.h
#ifndef _ADAPTER_H_
#define _ADAPTER_H_
class Target
{
	public:
	Target();
	virtual ~Target();
	virtual void Request();
	protected:
	private:
};
class Adaptee
{
	public:
	Adaptee();
	~Adaptee();
	void SpecificRequest();
	protected:
	private:
};
class Adapter:public Target
{
	public:
	Adapter(Adaptee* ade);
	~Adapter();
	void Request();
	protected:
	private:
	Adaptee* _ade;
};
#endif //~_ADAPTER_H_
//Adapter.cpp
#include "Adapter.h"
#include <iostream>
Target::Target()
{
}
Target::~Target()
{
}
void Target::Request()
{
	std::cout<<"Target::Request"<<std::endl;
}
Adaptee::Adaptee()
{
}
Adaptee::~Adaptee()
{
}
void Adaptee::SpecificRequest()
{
	std::cout<<"Adaptee::SpecificRequest"<<std::endl;
}
Adapter::Adapter(Adaptee* ade)
{
	this->_ade = ade;
}
Adapter::~Adapter()
{
}
void Adapter::Request()
{
	_ade->SpecificRequest();
}
//main.cpp
#include "Adapter.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
	Adaptee* ade = new Adaptee;
	Target* adt = new Adapter(ade);
	adt->Request();
	return 0;
}
总结:

接口继承指的是通过继承,子类获得了父类的接口,可以对外公开,而实现继承指的是通过继承子类获得了父类的实现(并不接口)。在 C++中的 public 继承既是接口继承又是实现继承,因为子类在继承了父类后既可以对外提供父类中的接口操作,又可以获得父类的接口实现。

Decorator Pattern

问题:

为已经定义好的类添加新的操作,而通过继承来扩展接口成本太高。
如何实现动态灵活的为对对象添加功能?

方案:

通过组合来实现扩展
在这里插入图片描述1. ConcreteComponent 和 Decorator 需 要 有 同 样 的 接 口 , 因 此ConcreteComponent 和 Decorator 有着一个共同的虚基类Component用于封装对外的接口。
2. ConcreteComponent 定义了一个具体的对象,继承并扩展Component,可以为其添加职责,是添加装饰的基础对象。
3. Decorator,装饰抽象类,继承Component,从外类来扩展Component类的功能(ConcreteComponent对象是其成员),但是对于Component来说,是无需知道Decorator的存在的。
4. Decorator通过调用ConcreteComponent的接口并扩展,完成增加职能的任务,但是对外接口依然是不变的;

Code:
//Decorator.h
#ifndef _DECORATOR_H_
#define _DECORATOR_H_
class Component
{
	public:
	virtual ~Component();
	virtual void Operation();
	protected:
	Component();
	private:
};

class ConcreteComponent:public Component
{
	public:
	ConcreteComponent();
	~ConcreteComponent();
	void Operation();
	protected:
	private:
};

class Decorator:public Component
{
	public:
	Decorator(Component* com);
	virtual ~Decorator();
	void Operation();
	protected:
	Component* _com;
	private:
};

class ConcreteDecorator:public Decorator
{
	public:
	ConcreteDecorator(Component* com);
	~ConcreteDecorator();
	void Operation();
	void AddedBehavior();
	protected:
	private:
};
#endif //~_DECORATOR_H_
//Decorator.cpp
#include "Decorator.h"
#include <iostream>
Component::Component()
{
}
Component::~Component()
{
}
void Component::Operation()
{
}
ConcreteComponent::ConcreteComponent()
{
}
ConcreteComponent::~ConcreteComponent()
{
}
void ConcreteComponent::Operation()
{
	std::cout<<"ConcreteComponent operation..."<<std::endl;
}
Decorator::Decorator(Component* com)
{
	this->_com = com;
}
Decorator::~Decorator()
{
	delete _com;
}
void Decorator::Operation()
{
}
ConcreteDecorator::ConcreteDecorator(Component*com):Decorator(com)
{
}
ConcreteDecorator::~ConcreteDecorator()
{
}
void ConcreteDecorator::AddedBehavior()
{
	std::cout<<"ConcreteDecorator::AddedBehacior...."<<std::endl;
}
void ConcreteDecorator::Operation()
{
	_com->Operation();
	this->AddedBehavior();
}
//main.cpp
#include "Decorator.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
	Component* com = new ConcreteComponent();
	Decorator* dec = new ConcreteDecorator(com);
	dec->Operation();
	delete dec;
	return 0;
}
总结:

Decorate pattern 将类的核心职责和装饰功能区分开,并且也能去除了重复的装饰逻辑。

Composite Pattern

问题:

递归构建树状的组合结构。

方案:

在这里插入图片描述Component 表示枝节点,管理叶节点;
Leaf 表示的是叶节点;

Code:
//Component.h
#ifndef _COMPONENT_H_
#define _COMPONENT_H_
class Component
{
public:
Component();
virtual ~Component();
public:
virtual void Operation() = 0;
virtual void Add(const Component& );
virtual void Remove(const Component& );
virtual Component* GetChild(int );
protected:
private:
};
#endif //~_COMPONENT_H_
//Component.cpp
#include "Component.h"
Component::Component()
{
}
Component::~Component()
{
}
void Component::Add(const Component& com)
{
}
Component* Component::GetChild(int index)
{
return 0;
}
void Component::Remove(const Component& com)
{
}
//Composite.h
#ifndef _COMPOSITE_H_
#define _COMPOSITE_H_
#include "Component.h"
#include <vector>
using namespace std;
class Composite:public Component
{
public:
Composite();
~Composite();
public:
void Operation();
void Add(Component* com);
void Remove(Component* com);
Component* GetChild(int index);
protected:
private:
vector<Component*> comVec;
};
#endif //~_COMPOSITE_H_
//Composite.cpp
#include "Composite.h"
#include "Component.h"
#define NULL 0
//define NULL POINTOR
Composite::Composite()
{
//vector<Component*>::iterator itend = comVec.begin();
}
Composite::~Composite()
{
}
void Composite::Operation()
{
vector<Component*>::iterator comIter = comVec.begin();
for (;comIter != comVec.end();comIter++)
{
(*comIter)->Operation();
}
}
void Composite::Add(Component* com)
{
comVec.push_back(com);
}
void Composite::Remove(Component* com)
{
comVec.erase(&com);
}
Component* Composite::GetChild(int index)
{
return comVec[index];
}
//Leaf.h
#ifndef _LEAF_H_
#define _LEAF_H_
#include "Component.h"
class Leaf:public Component
{
	public:
	Leaf();
	~Leaf();
	void Operation();
	protected:
	private:
};
#endif //~_LEAF_H_//Leaf.h
//Leaf.cpp
#include "Leaf.h"
#include <iostream>
using namespace std;
Leaf::Leaf()
{
}
Leaf::~Leaf()
{
}
void Leaf::Operation()
{
	cout<<"Leaf operation....."<<endl;
}
//main.cpp
#include "Component.h"
#include "Composite.h"
#include "Leaf.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
	Leaf* l = new Leaf();
	l->Operation();
	Composite* com = new Composite();
	com->Add(l);
	com->Operation();
	Component* ll = com->GetChild(0);
	ll->Operation();
	return 0;
}
总结:

Composite 模式在实现中有一个问题就是要提供对于子节点(Leaf)的管理策略,这里使用的是 STL 中的 vector,可以提供其他的实现方式,如数组、链表、Hash 表等。

Proxy Pattern

方案:

在这里插入图片描述

应用场景:

远程代理:为网络上的对象创建一个局部的本地代理;
虚代理:需要创建开销非常大的对象时,代理存放构造时间很长的真实对象;
安全代理:根据真实对象的不同操作权限,让代理完成相应权限控制范围内的操作;
智能指引:当真实对象被调用时,代理完成另外一些任务。比如智能指针内部维护的引用计数,当计数为零则释放对象资源;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值