C++设计模式新解一 代理模式 (PS设计模式的必要性)

本文通过游戏开发中的案例,解释了设计模式的重要性和应用时机,特别是开闭原则和代理模式的运用,帮助开发者理解如何提高代码的扩展性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么要学习设计模式?

我一直没太大的感觉,代码也写了一些,但是没有见哪里用到过。

最近项目倒闭,公司要向别的项目组分人,去见别的组的程序老大,这个问题又重新提上日程。


然后在铩羽而归之后,重新看着设计模式的六大原则,以及几个模式。

心里再也没有原来的那种茫然不知所措。

有一种奇怪的感觉,原来你也在这里。

复杂的东西只是说明你不明白,不代表它本身是复杂的。

失去的东西回过头去看,才发现它们的珍贵与不可替代。


举个简单的例子:

面向对象里有六个原则,其中一个原则叫做开闭原则,

原文是:“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)。


一言以蔽之,直接操作真实角色(成品)非常麻烦的时候,



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值