设计模式,门面模式,c++实现,委托,c++实现委托

委托:类a将功能委托类b实现
翻译:在类a中包含一个功能类b指针或对象,用到b功能类的功能时通过其指针或者对象调用b的功能,在调用模块看来,问题是交给类a解决了,而实际上,类a通过其成员类b对象或指针解决的该问题,此过程为“a委托b完成了问题”。
顺便一提:a依赖b指的是a类中包含一个b的基类的指针,就不一定是基类对象了,因为基类可能就是虚基类,产生不了对象。

门面模式:或叫外观模式(是前台吗?来杯咖啡。)

定义:将一个子系统的外部与内部的通信必须通过一个统一的对象进行。

翻译
子系统:由一个或多个功能类组成,一般是一群功能类组成,对某个或某些业务进行一系列处理后实现了一个服务。

统一的对象(门面):一个类,
该类对外只提供一个接口(只有一个public函数,剩下的数据或函数访问权限都不是public),代表外部可调用的服务;
在这个对外开放的接口函数中,需要对完成对子系统中功能类的调用以达到需求,
当需求改变时,内部依赖或关联的功能类与调用逻辑按照需求扩展,该类提供的服务接口函数保持不变。

类图摘自设计模式之禅:越简单越不好理解呢
在这里插入图片描述

作用
1.使功能类和高层调用模块解耦,减少系统的相互依赖,
2.外界访问到子系统内部便会强耦合,低内聚,维护困难;
3.外界访问门面类的一个服务接口就能弱耦合,高内聚,内部扩展方便,
4.对调用者毫无影响,因为对外接口没变化。

优点
1.减少依赖,降低耦合,主要是调用模块和子系统功能类之间的依赖和耦合。
2.使用灵活,门面接口不变,子系统自由活动。
3.安全,不在门面上开通的方法外部访问不到。

缺点
不符合开闭原则,对修改关闭,对扩展开放,在系统投产后发现有需要修复的错误时,只能修改门面的代码,继承覆写都不顶用,所以,设计时要慎之又慎。

使用场景
1.为一个复杂的模块或子系统提供一个供外界访问的借口。
2.子系统相对独立,对外部而言是黑盒,例如:计算利息,计算健康分数,计算综合分数等。
3.预防低水平人员带来的风险扩散,项目开发中的低水平技术人员容易因个人代码质量影响整体项目,故需规定其在指定的子系统中开发,然后再提供接口进行访问操作。

一个子系统有多个门面的场景
1.门面大到不能忍:代码超过200行就建议拆分。
2.子系统有不同访问路径:等级不同,权限不同,资源不同等,就可以给门面进行扩展(继承或代理)。

注意点
门面类不应该参与业务逻辑。
原因:门面类封装了服务并且时直接对外开放调用的,这要求门面类的稳定,稳定就是少修改,
倘若门面类对外开放的接口中有业务逻辑的组成部分,比如先调用a功能,然后b功能,然后c功能,业务改变时,门面就要相应的改,业务逻辑依赖于门面类,导致门面类不稳定。
避免门面类参与业务逻辑的方法:
子系统中不仅要有功能类实现功能,还要有业务逻辑类组合功能形成完整业务并提供该业务接口,门面类使用业务逻辑类提供的接口向外界提供服务,通过在子系统中增加业务逻辑类,使门面类与业务逻辑解耦,只负责向外界提供服务接口,并将外界需求委托给业务逻辑类。

代码示例:前台不生产咖啡,只是咖啡的搬运工,并将生产咖啡的任务委托给了厨房

//饮料类
class Drink
{
   
public:
	Drink()
	{
   
		kind = 0;
	}

	Drink(int value)
	{
   
		kind = value;
	}

	void get()
	{
   
		if (kind 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值