C++设计模式新解一 代理模式 (PS设计模式的必要性)
2015-12-10 17:26
381 查看
为什么要学习设计模式?
我一直没太大的感觉,代码也写了一些,但是没有见哪里用到过。
最近项目倒闭,公司要向别的项目组分人,去见别的组的程序老大,这个问题又重新提上日程。
然后在铩羽而归之后,重新看着设计模式的六大原则,以及几个模式。
心里再也没有原来的那种茫然不知所措。
有一种奇怪的感觉,原来你也在这里。
复杂的东西只是说明你不明白,不代表它本身是复杂的。
失去的东西回过头去看,才发现它们的珍贵与不可替代。
举个简单的例子:
面向对象里有六个原则,其中一个原则叫做开闭原则,
原文是:“Software entities should be open for extension,but closed for modification”。就是说模块应对扩展开放,而对修改关闭。模块应尽量在不修改原(是“原”,指原来的代码)代码的情况下进行扩展。
什么叫对扩展开放,对修改关闭。
很简单 你写了一个类,因为我是做游戏的,就拿游戏距离,比如一个角色类Player,
Player里有一些属性,比如敏捷,力量,智力等等,然后根据这些属性,玩家有一个计算战斗力的公式,假如我们命名为caculateWarPower()
我们开始就这样计算了Player的战斗力,
但我们知道游戏里(尤其是战斗类)必然会有特定的英雄职业,不同的英雄职业技能,装备,等级,这样一些外在加成,而且不是一次加上来的,后面也许会有宠物,翅膀之类加成。这些加成也会有对战斗力有影响,如果我们此时回过头去改原来Player的函数
caculateWarPower(),
所以此时相对正确的做法就是使用代理模式在新建每个职业角色的角色类,
比如
class Entity()
{
virtual int caculateWarPower();
}
class Player: Entity()
{
int caculateWarPower();
}
class Swordman: Entity()
{
protected:
Player * owner;
int caculateWarPower(){
int totalPower = a + b + owner->caculateWarPower();
return totalPower;
}
}
代理模式的参与者要注意的有3点:
1.抽象角色,声明真实对象和代理对象的共同接口
2.代理角色,代理角色内部含有对真实对象的引用(不要咬文嚼字把它理解为&引用),从而可以操作代理对象,同时代理对象提供和真实对象提供相同的接口,以便在任何时刻都能替代真实对象。同时代理对象在执行真实对象的操作时,可以附加其他的操作,相当于对真实对象操作。
3.真实角色,代理角色所代表的真实对象,是我们最终要引用的对象。
何时使用设计模式:
当我们需要使用的对象很复杂或者需要很长时间去构造,这时就可以使用代理模式(Proxy)。例如:如果构建一个对象很耗费时间和计算机资源,代理模式(Proxy)允许我们控制这种情况,直到我们需要使用实际的对象。一个代理(Proxy)通常包含和将要使用的对象同样的方法,一旦开始使用这个对象,这些方法将通过代理(Proxy)传递给实际的对象。 一些可以使用代理模式(Proxy)的情况:
一个对象,比如一幅很大的图像,需要载入的时间很长。
一个需要很长时间才可以完成的计算结果,并且需要在它计算过程中显示中间结果
一个存在于远程计算机上的对象,需要通过网络载入这个远程对象则需要很长时间,特别是在网络传输高峰期。
一个对象只有有限的访问权限,代理模式(Proxy)可以验证用户的权限
代理模式(Proxy)也可以被用来区别一个对象实例的请求和实际的访问,例如:在程序初始化过程中可能建立多个对象,但并不都是马上使用,代理模式(Proxy)可以载入需要的真正的对象。这是一个需要载入和显示一幅很大的图像的程序,当程序启动时,就必须确定要显示的图像,但是实际的图像只能在完全载入后才可以显示!这时我们就可以使用代理模式(Proxy)。
一言以蔽之,直接操作真实角色(成品)非常麻烦的时候,
我一直没太大的感觉,代码也写了一些,但是没有见哪里用到过。
最近项目倒闭,公司要向别的项目组分人,去见别的组的程序老大,这个问题又重新提上日程。
然后在铩羽而归之后,重新看着设计模式的六大原则,以及几个模式。
心里再也没有原来的那种茫然不知所措。
有一种奇怪的感觉,原来你也在这里。
复杂的东西只是说明你不明白,不代表它本身是复杂的。
失去的东西回过头去看,才发现它们的珍贵与不可替代。
举个简单的例子:
面向对象里有六个原则,其中一个原则叫做开闭原则,
原文是:“Software entities should be open for extension,but closed for modification”。就是说模块应对扩展开放,而对修改关闭。模块应尽量在不修改原(是“原”,指原来的代码)代码的情况下进行扩展。
什么叫对扩展开放,对修改关闭。
很简单 你写了一个类,因为我是做游戏的,就拿游戏距离,比如一个角色类Player,
Player里有一些属性,比如敏捷,力量,智力等等,然后根据这些属性,玩家有一个计算战斗力的公式,假如我们命名为caculateWarPower()
我们开始就这样计算了Player的战斗力,
但我们知道游戏里(尤其是战斗类)必然会有特定的英雄职业,不同的英雄职业技能,装备,等级,这样一些外在加成,而且不是一次加上来的,后面也许会有宠物,翅膀之类加成。这些加成也会有对战斗力有影响,如果我们此时回过头去改原来Player的函数
caculateWarPower(),
所以此时相对正确的做法就是使用代理模式在新建每个职业角色的角色类,
比如
class Entity()
{
virtual int caculateWarPower();
}
class Player: Entity()
{
int caculateWarPower();
}
class Swordman: Entity()
{
protected:
Player * owner;
int caculateWarPower(){
int totalPower = a + b + owner->caculateWarPower();
return totalPower;
}
}
代理模式的参与者要注意的有3点:
1.抽象角色,声明真实对象和代理对象的共同接口
2.代理角色,代理角色内部含有对真实对象的引用(不要咬文嚼字把它理解为&引用),从而可以操作代理对象,同时代理对象提供和真实对象提供相同的接口,以便在任何时刻都能替代真实对象。同时代理对象在执行真实对象的操作时,可以附加其他的操作,相当于对真实对象操作。
3.真实角色,代理角色所代表的真实对象,是我们最终要引用的对象。
何时使用设计模式:
当我们需要使用的对象很复杂或者需要很长时间去构造,这时就可以使用代理模式(Proxy)。例如:如果构建一个对象很耗费时间和计算机资源,代理模式(Proxy)允许我们控制这种情况,直到我们需要使用实际的对象。一个代理(Proxy)通常包含和将要使用的对象同样的方法,一旦开始使用这个对象,这些方法将通过代理(Proxy)传递给实际的对象。 一些可以使用代理模式(Proxy)的情况:
一个对象,比如一幅很大的图像,需要载入的时间很长。
一个需要很长时间才可以完成的计算结果,并且需要在它计算过程中显示中间结果
一个存在于远程计算机上的对象,需要通过网络载入这个远程对象则需要很长时间,特别是在网络传输高峰期。
一个对象只有有限的访问权限,代理模式(Proxy)可以验证用户的权限
代理模式(Proxy)也可以被用来区别一个对象实例的请求和实际的访问,例如:在程序初始化过程中可能建立多个对象,但并不都是马上使用,代理模式(Proxy)可以载入需要的真正的对象。这是一个需要载入和显示一幅很大的图像的程序,当程序启动时,就必须确定要显示的图像,但是实际的图像只能在完全载入后才可以显示!这时我们就可以使用代理模式(Proxy)。
一言以蔽之,直接操作真实角色(成品)非常麻烦的时候,
相关文章推荐
- c++学习笔记(2)
- C++11中的匿名函数(lambda函数,lambda表达式)
- cygwin编译c++的坑
- 使用函数包装器的 通用泛化的命令类
- 如何优雅地使用c语言编写爬虫
- 将两个有序链表head1 head2,合并为一个链表
- C语言练习作业(七)
- 无向图的深度优先搜索(最终版)
- C++: 构造函数和析构函数
- C++primer学习:标准库特殊设施:正则表达式基础
- C/C++/Go混合编程实践之GoJieba
- c++ 11 特性
- c c++怎么判断一个字符串中是否含有汉字
- std::forward 完美转发
- c++实现的归并排序算法
- VS2012环境下C++连接mysql数据库
- C++设计模式之Singleton
- c语言之sizeof
- 转 夕甲甲:孔乙己之 C++ 版
- C++关键字explict的详解和使用