适配器模式,装饰模式,代理模式异同( 二 )


而对于新的接口,客户端则不必去传入date 参数
[java]
publicinterfaceAppOrderApi{//只需要传入订单Id即可publicvoidupdateDate(StringorderId,Stringclient);}
新的实现类:
[java]
publicclassAppOrderApiImplimplementsAppOrderApi{SourceOrderApisourceOrderApi;publicAppOrderApiImpl(){sourceOrderApi=newSourceOrderApiImpl();}@OverridepublicvoidupdateDate(StringorderId,Stringclient){//这里适配的方式随意代理器,但是保证是要完全兼容原有的,就是保证调用原有的接口sourceOrderApi.updateDate(orderId,"9999-12-31",client);}}
main方法:
[java]
publicclassTest{publicstaticvoidmain(String[]args){AppOrderApiappOrderApi=newAppOrderApiImpl();appOrderApi.updateDate("123456","user");}}
运行结果:
在这套代码中,新的实现类持有了老接口的对象,就是把这个对象new 出来 。。。
然后在新的方法里,进行适配操作 。
而这里所谓的适配就是兼容老接口和兼容新接口 。
兼容老接口非常简单,就是直接调用老的方法即可 。
而兼容新接口就是你所要去做的业务逻辑 。。。
比如我这里做了比较简单的操作,app类的统一传入“9999-12-31”,这些都是根据具体的项目需求去实现你的业务代码 。
看到这,很多人会觉得 这样的代码是不是很常见 。。。。
我自己都特意去翻了一下我之前的代码,很多类似的写法 。。。
其实设计模式很多时候都融入到我们的代码中,只是我们没有去理解这种模式,所以就算你自己写出来了,都不知道这是一种适配器模式 。。。
设计模式是一种思想,他没有固定的实现代码,我大量查阅了很多大神的的适配器模式解释,大家都不约而同的提到了类的适配和对象的适配,代码中有实现继承这样的写法 。当然了,这些大神的写法都是比较标准的 。。。
但是仔细再回看下GOF的适配器模式解释 。
适配器模式,装饰模式,代理模式异同
只需要将原接口转化为客户希望的另一个接口,就是适配器模式!
转化无非就是1.继承原类或者实现原接口 2.持有原接口的对象
再实现目标接口 。。。。
那么第一种就是类的适配,第二种就是对象的适配!仅此而已 。。。。
那么再回头来说代理模式,在代码上,和适配器模式有着相似的地方!
再比如,现在我们公司的系统又要进行升级,我们原先的接口没有加入安全机制,导致了任何人都可以随意调用这个接口,现在公司需要对这个接口进行改造,只其只能被admin这个客户端调用,其他用户一律要输入账号密码才能调用
那么上面原接口和类不需要改动,我们只需要新增代理器即可 。。。
这里就会显出代理模式和适配器模式最大的区别,代理模式是与原对象实现同一个接口,而适配器类则是匹配新接口,说白了,实现一个新的接口 。
代理类:
[java]
publicclassProxySourceOrderApiImplimplementsSourceOrderApi{SourceOrderApisourceOrderApiImpl;publicProxySourceOrderApiImpl(){sourceOrderApiImpl=newSourceOrderApiImpl();}@OverridepublicvoidupdateDate(StringorderId,Stringdate,Stringclient){//进行判断,如果是admin则更新否则让其输入账号密码if("admin".equals(client)){sourceOrderApiImpl.updateDate(orderId,date,client);}else{System.out.println("账号不是admin,没有查询权限,请输入以admin操作");}}}
main方法:
[java]
publicclassTest{publicstaticvoidmain(String[]args){SourceOrderApiproxySourceOrderApiImpl=newProxySourceOrderApiImpl();proxySourceOrderApiImpl.updateDate("123456","2014-10-15","user");proxySourceOrderApiImpl.updateDate("123456","2014-10-15","admin");}}


以上关于本文的内容,仅作参考!温馨提示:如遇专业性较强的问题(如:疾病、健康、理财等),还请咨询专业人士给予相关指导!

「辽宁龙网」www.liaoninglong.com小编还为您精选了以下内容,希望对您有所帮助: