代理模式,适配器模式,装饰者模式的区别
适配器模式主要解决接口转换的问题,代理模式主要解决对象无法直接访问的问题,装饰者模式主要用来增强功能。
适配器模式和代理模式
首先看下适配器模式和代理模式的类图,细心观察会发现对于代理模式RealSubject实现了Subject的接口,而适配器模式的Adaptee并没有实现Target接口,这说明对于代理模式客户端最终访问的是同一个接口,而对于适配器模式,客户端最终访问的是不同的接口。所以适配器解决的是接口转换的问题,可以将A接口的请求转成B接口,而对于代理模式来说客户端调用的是同一个接口,只不过由于某些原因实现了该接口的对象无法直接访问,所以需要通过代理对象来间接访问。
可能这样说很多人还是没法理解,所以我分别举个例子。
适配器模式
某些旧功能想做升级,因为旧功能用的是旧接口,而新功能用的是新接口,这就存在接口不兼容问题,旧接口因为历史原因不能直接换成新接口,这时候就可以通过适配器做接口转换,使旧的功能也可以访问新接口。
代理模式
Android进程间通信是通过binder实现的,binder实现进程间通信用到了代理模式。A进程想访问某个功能,这个功能在本地和B进程都有相同的实现,本地接口可以创建本地对象直接访问,而B进程的接口就需要通过创建代理对象进行间接访问。代理对象在其中主要解决了数据的跨进程通信问题,首先将数据序列化后从A进程传到B进程并作为参数传递给调用接口,接口执行完后将返回的数据再发给A进程,代理对象将数据反序列化后传递给A进程的调用对象。
代理模式:间接访问对象
适配器模式:接口兼容
代理模式和装饰模式
对于装饰模式,主要是用来增强功能,当你想扩展某些功能,但是又不想通过继承实现,那么可以使用装饰模式实现,通过装饰
模式可以扩展功能,而且可以复用装饰者对象,相比于继承会更加灵活。虽然它的类图和代理模式长得也很像,但是它们解决的问题是不一样的,一个主要解决对象无法直接访问的问题,一个是用来扩展功能。
装饰者模式:扩展系统功能