设计模式 - 代理模式、桥接模式、中介者模式、命令模式

相似点

开始的时候,这四个模式在名字上的意思有相似的地方,在实际生活中,如房屋中介、买房人、卖房人,房屋中介当然是一个中介,因为它负责买房人和卖房人之间的沟通;房屋中介也是一个代理,它在卖房人面前是买房人的代理,在卖房人面前时买房人的代理;房屋中介也是一个桥接,用于连接买房人和卖房人;房屋中介也可以是命令的传达者,买房人将买房的命令发送给中介,中介根据命令找到相应的卖房人。那这字面意思相似的四者到底有什么不同的使用场合。


UML


代理模式

中介模式

桥接模式

命令模式
  



代理模式

使用场合

1. 做过Android的都应该知道Android的进程间通信是Binder,Binder的客户端调用服务端都是通过调用服务端在客户端进程的代理进行的,由于客户端无法和服务端直接通信,因为他们在两个进程,所以这个代理其实就通过进程间通信和服务端交互,但是看起来就好像客户端直接和服务端通信一样。

2. 引用计数,C++利用引用计数来管理对象内存的回收,我们在使用这个对象时,都是通过引用计数来操作的,因为我们不知道这个对象实际的地址,这个引用计数就是该对象的代理;所以,上面的UML图不一定是准确的,代理和被代理对象不一定继承于一个基类,它们之间可以没有任何关系;


特点

1. 一对一,这个代理只能代表一个对象;

2. 只能代理一方,也就是 PB 是B的代理,A能够通过PB访问B,但是B不能通过PB访问A;


中介模式

使用场合

1. Android的Binder的总服务ServiceManager就是一个中介者,它们负责所有的客户端和所有服务之间的通信;


特点

1. 多对多,这些被管理的对象之间都可以通信,它们的业务关系应该是交织在一起的;

2. A能够通过中介访问B,B也能够通过中介访问A;


桥接模式

使用场合
当一个类有很多属性时,我们可以通过继承的方式来继承这些属性,但是如果属性不稳定时,继承会造成大量的继承类,所以这个时候使用组合或者聚合更好一些;

特点
1. 一对多的关系,一个类可以有很多其他属性;
2. 桥接强调不是对象之间的通信,而是拥有某些属性;


命令模式

使用场合
根据某种情况调用不同的处理者时,而且情况的个数不确定,很有可能在以后会进行相应的增加或者减少的,就需要使用命令模式;


特点
1. 多对多的关系,负责多对多之间的通信;
2. 命令模式更多时候是命令的个数是不确定的,当增加命令时,只要增加相应的命令和修改中间的传达者即可,其他不需要修改;

区别

1. 我们可以看出,中介者模式和代理模式和命令模式比较相似,他们强调的是通信,桥接模式强调的时候拥有属性;
2. 中介者模式是多对多通信,代理是一对一通信,桥接是一对多,命令模式是多对多通信;
3. 代理是通信只能从一方到另外一方,中介者是双向都可以通信;
4. 中介者和代理模式一般接口是固定的(即请求比较固定),而命令模式请求一般不固定,可能会改变,所以将命令进行对象化和独立化使得代码更加灵活;


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值