c++设计模式之概括--结构型模式

c++设计模式之概括–结构型模式
结构类模式都是原来的类已经定型, 现在需要在原基础上进行一些优化,功能控制,功能扩充等,
我们应该怎么做的问题. 那就是,保留一个原对象的指针, 当对我们的包装类调用的时候,我们
要恰当的调用保留的对象的函数. 包装,当然是有目的的.

结构型模式:

  1. 适配器模式:将一个物件的界面’转接’成当事人预期的样子。 目的,协调两类工作
  2. 桥接模式:将一个抽象与实现解耦,以便两者可以独立的变化。 目的,让两类独立变化
  3. 组合模式:树状结构的物件,每个物件有相同的界面 目的,让物件集合与物件有相同的对外接口
  4. 装饰模式: 对于已有的类,不使用继承方式而添加新功能的一种方式. 目的,为类添加功能
  5. 外观模式:对于已有的界面建立一个简化的界面以封装较复杂的交互. 目的,简化类对外接口
  6. 享元模式:通过共享以便有效的支持大量小颗粒对象。 目的,减少对象占用的内存
  7. 代理模式:为其他对象提供一个代理以控制对这个对象的访问。 目的,控制对类的访问.

适配器模式:(简述)

有两个类A 和 B, 接口都已经确定,但接口不兼容,这时候需要用到适配器类,
用以衔接对A接口的调用,转嫁到B类接口上去完成.
客户端代码:

	Adaptee* ade = new Adaptee;	// Adaptee类,被适配的类
	Adapter* adt = new Adapter(ade);	//适配的类,Adapter 类实现了类A的接口,并具有被适配对象的B的指针
	adt->Request();	//adt 将适配类的请求,转化为被适配类的接口调用.

建议用这种保留对象指针的方式.
也有用类方式来直接转换的.

桥接模式:(简述)

当类沿着两个方向来变化时,就要把类分开成2个类,让一个类包含另一个类对象的指针.
没找到好例子.

组合模式:

组合模式使得对单个对象的使用和对组合对象的使用具有一致性.
  Leaf* l = new Leaf();		//叶子是一个具体的类,它可以执行自己的操作
  l->Operation();
  Composite* com = new Composite();//建一个组合类,它可以添加删除虚拟的叶子指针
  com->Add(l);				//这里添加了一个真叶子
  com->Operation();			//对组合类操作,显示是对它所包含的每一个叶节点操作
  virtualLeaf* vl = com->GetChild(0);	//从组合中得到一个虚拟叶指针,它指向一个实叶对象.
  vl->Operation();				//虚拟指针所指操作会执行实叶类的操作.

保障对一个集合的操作和对一个节点的操作接口是一致的.

装饰模式(简述)

对于已有的类component,不使用继承方式而添加新功能的一种方式
也许这个component类是个家族, component是个虚基类,有很多具体实现类.这我们不管.

我们先声明一个修饰类,它继承了compoment类,后面我们就好操作了.
这个修饰类是个家族类,它要重载component doAction方法并添加新的行为,
下面看其要素.

  1. 声明一个修饰类,它继承了component 类, 同时声明一些具体的修饰类.
  2. 将component类对象作为修饰类的构造参数,以便装饰类保留对象指针
  3. 每个具体修饰类方法,都是先执行自己的方法(修饰方法),再执行保留的指针的doActon方法,
    这样就实现了修饰包含对象的doAction 方法.
  4. 由于被包含对象的指针可能指向一个具体的装饰对象(也是component对象),所以它也会调用
    自己的doAction 方法,从而形成装饰链.
    装饰类与component 类是聚合关系,也是继承关系

其要义就是:
一共创建了n个对象,执行自己的修饰方法,再执行保留对象的方法. 结果可以形成修饰链.

实例代码:
为一个士兵装饰手枪,步枪,迫击炮.

	Soleier *soldier = new Soldier()
	Decorate *d1 = new Postol(soldier); 	//第一次被装备的士兵
	Decorate *d2 = new Rifle(d1);			//第二次被装备的士兵
	Decorate *d3 = new mortal(d2);			//第三次被装备的士兵
	d3 ->show();
d3 将是一个既有迫击炮,又有步枪,又有手枪的超强士兵.
手枪类,步枪类,迫击炮类都是具体的装饰类, 装饰类是soldier 的子类,为了扩充soldier 的show 方法.
这里具体代码从略.

外观模式:

现在类已经写好了, 但是接口比较多而复杂, 比方说用户只需要一点点,怎样让用户有更好的体验呢?
用外观类, 我们重新简化,封装一下对外的接口.

示例代码:(客户端)

Facade* f = new Facade();
f->OperationWrapper();

被封装的代码可能是:
void Facade::OperationWrapper() {
_subs1->Operation();
_subs2->Operation();
}
_subs1, _subs2 是它包含的两个对象.

享元模式:

通过共享以便有效的支持大量小颗粒对象。
当对象很多时使用.
例如当你createObject时,通常是new 这个对象, 如果这个对象创建过,并且这个对象
可以共享使用,则不用再创建这个对象,而返回它的指针就可以了. 这样就节省了内存.
例如 char * pStr = fw->getObject(“hello”); 第一遍为"hello"字符分配了内存.
第二次再调用 char *pStr2 = fw->getObject(“hello”) 时,则不必再为它分配内存,直接
返回先前的指针就可以了. 跟单例有点像,
例子就不举了,当需要创建大量对象并需要节省内存时考虑使用.

代理模式:

为其他对象提供一个代理以控制对这个对象的访问。
原来你跟component 打交道,现在你跟代理打交道,其实只要完成你的功能就可以了,你管它跟谁打交道呢.
采用代理模式相当于引入了中间人, 中间人把你的请求转发给对象. 那为什么要引入中间人呢?
例如可以用来进行权限检查等内容.

Component* comp = new ConcreteComponent();	//创建一个具体的subject(课题)对象
Proxy* p = new Proxy(comp);		//代理保存了对象指针
p->Request();				//调用代理的请求,将会被转发给对象. (有可能被代理拦截)

代理类与component类是聚合关系, 代理模式与compoment 有相同的接口.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值