设计模式C++ 笔记二 结构型模式
来源:互联网 发布:手机支持什么网络 编辑:程序博客网 时间:2024/05/16 19:01
1、Bridge模式
用户需求发生变化,要两个算法实现功能,往常状态需要多添加一个类。Bridge将系统分成两个相对独立的部分,抽象部分和实现部分。抽象部分根据参数,运行时动态决定采用哪个子类的函数。这样再加入一个函数实现时,只需要修改实现部分,继承出一个子类,不需要修改抽象部分。
//--------------Abstraction.h -----------------
#ifndef _ABSTRACTION_H_
#define _ABSTRACTION_H_
class AbstractionImp;
class Abstraction //抽象部分
{
public:
virtual ~Abstraction();
virtual void Operation() = 0;
protected:
Abstraction();
};
class RefinedAbstraction:public Abstraction
{
public:
RefinedAbstraction(AbstractionImp* imp);
~RefinedAbstraction();
void Operation(){ _imp->Operation(); }
private:
AbstractionImp* _imp;
};
//--------------------AbstractionImp.h ------------------------
#ifndef _ABSTRACTIONIMP_H_
#define _ABSTRACTIONIMP_H_
class AbstractionImp //实现部分
{
public:
virtual ~AbstractionImp();
virtual void Operation() = 0;
protected:
AbstractionImp();
};
class ConcreteAbstractionImpA:public AbstractionImp
{
public:
ConcreteAbstractionImpA();
~ConcreteAbstractionImpA();
virtual void Operation();
};
class ConcreteAbstractionImpB:public AbstractionImp
{
public:
ConcreteAbstractionImpB();
~ConcreteAbstractionImpB();
virtual void Operation();
};
//------------------------AbstractionImp.cpp ----------------------------------
#include "AbstractionImp.h"
#include <iostream>
using namespace std;
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;
}
2、Adapter模式
当两个类的接口不一致时,使用Adapter将其中一个的接口转化为另一个希望的接口
//---------------------------Adapter.h -----------------------------类模式,通过继承获得接口
#ifndef _ADAPTER_H_
#define _ADAPTER_H_
class Target
{
public:
Target();
virtual ~Target();
virtual void Request();
};
class Adaptee
{
public:
Adaptee();
~Adaptee();
void SpecificRequest();
};
class Adapter:public Target,privateAdaptee
{
public:
Adapter();
~Adapter();
void Request(); { this->SpecificRequest(); }
};
//----------------------Adapter.h --------------------------组合的方式,获得接口
#ifndef _ADAPTER_H_
#define _ADAPTER_H_
class Target
{
public:
Target();
virtual ~Target();
virtual void Request();
};
class Adaptee
{
public:
Adaptee();
~Adaptee();
void SpecificRequest();
};
class Adapter:public Target
{
public:
Adapter(Adaptee* ade); {this->_ade = ade; }
~Adapter();
void Request(); {_ade->SpecificRequest(); }
private:
Adaptee* _ade;
};
int main(int argc,char* argv[])
{
Adaptee* ade = new Adaptee;
Target* adt = new Adapter(ade);
adt->Request();
return 0;
}
在 Adapter 模式的两种模式中,有一个很重要的概念就是接口继承和实现继承的区别和联系。
接口继承指的是通过继承,子类获得了父类的接口。
实现继承指的是通过继承子类获得了父类的实现(并不统共接口)。
在 C++中的 public 继承既是接口继承又是实现继承,因为子类在继承了父类后既可以对外提供父类中的接口操作,又可以获得父类的接口实现。当然我们可以通过一定的方式和技术模拟单独的接口继承和实现继承,例如我们可以通过 private 继承获得实现继承的效果(private 继承后,父类中的接口都变为 private,当然只能是实现继承了。),通过纯抽象基类模拟接口继承的效果,但是在 C++中 pure virtual function 也可以提供默认实现,因此这是不纯正的接口继承,但是在 Java 中我们可以 interface 来获得真正的接口继承了。
3、Decorator
在设计和开发中,当需要对一个类添加操作时,往往使用继承来实现。但是继承带来了系统的复杂性,这时候可以使用Decorator。它不是通过继承,而是通过组合的方式实现。
//--------------------------Decorator.h ----------------------------
#ifndef _DECORATOR_H_
#define _DECORATOR_H_
class Component
{
public:
virtual ~Component();
virtual void Operation();
protected:
Component();
};
class ConcreteComponent:public Component
{
public:
ConcreteComponent();
~ConcreteComponent();
void Operation(){ std::cout<<"ConcreteComponent operation..."<<std::endl; }
};
class Decorator:public Component
{
public:
Decorator(Component* com) { this->_com = com; }
virtual ~Decorator();
void Operation(); {}
protected:
Component* _com;
};
class ConcreteDecorator:public Decorator
{
public:
ConcreteDecorator(Component* com):Decorator(com) { }
~ConcreteDecorator();
void Operation(); { _com->Operation(); this->AddedBehavior(); }
void AddedBehavior() { std::cout<<"ConcreteDecorator::AddedBehacior...."<<std::endl; }
};
int main(int argc,char* argv[])
{
Component* com = new ConcreteComponent();
Decorator* dec = new ConcreteDecorator(com);
dec->Operation();
}
5、Flyweight
当系统中存在太多对象时,会造成太多的存储开销,特别是这些对象有共同特征时,比如都是字母a,这个时候可以使用Flyweight模式。
Flyweight 模式中有一个类似 Factory 模式的对象构造工厂FlyweightFactory,当客户程序员(Client)需要一个对象时候就会向 FlyweightFactory 发出请求对象的消息 GetFlyweight()消息,FlyweightFactory 拥有一个管理、存储对象的“仓库”(或者叫对象池,vector 实现),GetFlyweight()消息会遍历对象池中的对象,如果已经存在则直接返回给 Client,否则创建一个新的对象返回给 Client。当然可能也有不想被共享的对象(例如结构图中的 UnshareConcreteFlyweight),但不在本模式的讲解范围,故在实
现中不给出
//----------Flyweight.h -----------------
class Flyweight
{
public:
virtual ~Flyweight();
virtual void Operation(const string& extrinsicState);
string GetIntrinsicState();
protected:
Flyweight(string intrinsicState) { this->_intrinsicState = intrinsicState; } ;
private:
string _intrinsicState;
};
class ConcreteFlyweight:public Flyweight
{
public:
ConcreteFlyweight(string intrinsicState) :Flyweight(intrinsicState) { cout<<"ConcreteFlyweight Build....."<<intrinsicState<<endl; }
~ConcreteFlyweight();
void Operation(const string& extrinsicState); { cout<<"ConcreteFlyweight: 内 蕴["<<this->GetIntrinsicState()<<"] 外 蕴["<<extrinsicState<<"]"<<endl;
}
//------------------FlyweightFactory.h ------------------
#include "Flyweight.h"
#include <string>
#include <vector>
using namespace std;
class FlyweightFactory
{
public:
FlyweightFactory();
~FlyweightFactory();
Flyweight* GetFlyweight(const string& key)
{
vector<Flyweight*>::iterator it = _fly.begin();
for (; it != _fly.end();it++)
{
//找到了,就一起用,^_^
if ((*it)->GetIntrinsicState() == key)
{
cout<<"already created by users...."<<endl;
return *it;
}
}
Flyweight* fn = new ConcreteFlyweight(key);
_fly.push_back(fn);
return fn;
};
private:
vector<Flyweight*> _fly;
};
//----------------main.cpp --------------------
#include "Flyweight.h"
#include "FlyweightFactory.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
FlyweightFactory* fc = new FlyweightFactory();
Flyweight* fw1 = fc->GetFlyweight("hello");
Flyweight* fw2 = fc->GetFlyweight("world!");
Flyweight* fw3 = fc->GetFlyweight("hello");
return 0;
}
- 设计模式笔记--结构型模式之二--桥接 Bridge
- 设计模式C++ 笔记二 结构型模式
- [设计模式笔记]二. 结构型模式总结
- [设计模式笔记]快速小结(二)---结构型模式
- [设计模式笔记]二. 结构型模式--7.Adapter模式(适配器模式)(二)
- [设计模式笔记]二. 结构型模式--8.Bridge模式(桥模式)(二)
- [设计模式笔记]二. 结构型模式--12.Flyweight模式(享元模式)(二)
- [设计模式笔记]二. 结构型模式--7.Adapter模式(适配器模式)(一)
- [设计模式笔记]二. 结构型模式--8.Bridge模式(桥模式)(一)
- [设计模式笔记]二. 结构型模式--10.Decorator模式(装饰模式)(一)
- [设计模式笔记]二. 结构型模式--11.Facade模式(外观模式)(一)
- [设计模式笔记]二. 结构型模式--12.Flyweight模式(享元模式)(一)
- [设计模式笔记]二. 结构型模式--13.Proxy模式(代理模式)(一)
- 设计模式之结构型模式二
- php设计模式(二):结构型模式
- 走进设计模式(二)-结构型模式
- 设计模式-结构型软件设计模式(二)
- 设计模式:结构型模式(二)
- spring mvc的SimpleFormController与AJAX结合遇到的一些问题
- box unbox 中的 NullPointException
- 线性表之顺序存储结构--C实现
- LIBTIFF源文件的编译(X86,X64)
- Struts2的 ActionContext && ServletActionContext
- 设计模式C++ 笔记二 结构型模式
- linux子系统的初始化_subsys_initcall():那些入口函数
- 从N986和A199看华为中兴
- Android四大组件之Activity篇(二)(Activity的生命周期)
- 生成验证码
- socket通信简介
- 卡洛斯·斯利姆·埃卢
- TCP三次握手四次挥手详解
- 希尔排序的实现