适配器模式(结构型)
来源:互联网 发布:淘宝理财产品 财富宝 编辑:程序博客网 时间:2024/06/05 20:34
思考问题:对于遗留系统,service已经存在了,controller层却假定service层会提供add(User u)方法新增用户,而实际上service层声明的却是insert(User u)来新增用户,在controller层和service层对接时才发现该问题,在不修改已有代码的前提下,你该如何完成对接?
解答:有两种方式:
- 继承;
组合(不理解可以继续看下去);
首先讲大家熟悉的继承方式,结合问题,就是让一个适配器类UserServiceAdapter继承service层的实现类UserServiceImpl,并且实现controller层假定好的Service接口方法,当遇到方法名不一致时,只需要在实现的add(User u) 方法中调用父类insert(u)方法即可实现对接。
实例代码如下:
UserServiceI假定是controller层定立的:
package com.shusheng.adapter.extend;/**该方法是controller层假定的*/public interface UserServiceI { /**添加用户*/ public boolean add(User u);}
UserServiceImpl假定为遗留系统已有的:
package com.shusheng.adapter.extend;/**假设该类是遗留系统已有的*/public class UserServiceImpl { /**添加用户*/ public boolean insert(User u){ System.out.println("这是userServiceImpl层的insert方法"); return true; }}
使用继承实现重用代码目的:
package com.shusheng.adapter.extend;/**适配器类,实例化到controller时就使用这个类*/public class UserServiceAdapter extends UserServiceImpl implements UserServiceI{// private UserServiceImpl userServiceImpl = new UserServiceImpl();继承时不需要声明 @Override public boolean add(User u) { System.out.println("这是适配器 的add方法"); return insert(u);//显式调用父类UserServiceImpl的insert方法 }}
用户类:
package com.shusheng.adapter.extend;/**用户类*/public class User {}
测试程序:
package com.shusheng.adapter.extend;public class AdapterTest { public static void main(String[] args) { UserServiceI userServiceI = new UserServiceAdapter();//完成了对接 System.out.println(userServiceI.add(new User())); }}
第二种解决方法是组合:
对于使用重用代码的方式,如果不是很强烈的is-a关系,尽量少用继承,因为继承会导致系统体系结构很复杂,不利于解耦。
组合就是在一个类中增加被组合类的一个引用,来达到显示重用代码的目的。(如果还是不能理解继续看下去)
UserServiceI类:
package com.shusheng.adapter;/**该方法是controller层假定的*/public interface UserServiceI { /**添加用户*/ public boolean add(User u);}
UserServiceImpl类:
package com.shusheng.adapter;/**假设该类是遗留系统已有的*/public class UserServiceImpl { /**添加用户*/ public boolean insert(User u){ System.out.println("这是userServiceImpl层的insert方法"); return true; }}
为了对接而设计的适配器类:
package com.shusheng.adapter;/**适配器类,注入到controller时就使用这个类即可*/public class UserServiceAdapter implements UserServiceI{ private UserServiceImpl userServiceImpl = new UserServiceImpl();//组合 @Override public boolean add(User u) { System.out.println("这是适配器 的add方法"); return userServiceImpl.insert(u);//显式调用UserServiceImpl的insert方法 }}
用户类:
package com.shusheng.adapter;public class User {}
测试类代码:
package com.shusheng.adapter;public class AdapterTest { public static void main(String[] args) { UserServiceI userServiceI = new UserServiceAdapter();//完成了对接 System.out.println(userServiceI.add(new User())); }}
1 0
- 适配器模式(结构型)
- 适配器模式(结构型)
- 适配器模式(结构型)
- Adapter适配器模式(结构型模式)
- 适配器模式(结构型设计模式)
- 结构型模式(1)---适配器模式
- 适配器模式(结构型模式)
- (结构型模式一)适配器模式
- Adapter模式(适配器模式 结构型)
- 适配器模式(结构型设计模式)
- 结构型-适配器模式
- 结构型模式-适配器
- 结构型模式-适配器
- 结构型--适配器模式
- 适配器模式(结构型)
- 结构型模式--适配器模式
- 适配器模式 - 结构型模式
- 结构型模式-适配器模式
- JDBC优化
- QImage
- ubuntu Qt环境链接mysql测试
- IP正则
- ViewDragHelper详解
- 适配器模式(结构型)
- ORACLE定时任务时间间隔设置
- qint64转时间
- java反射详解
- IOS APP端京东支付集成
- java里String需要注意的地方以及基本数据类型注意点(不定期修改更新)
- 诶哟好多瓶颈的微信开发
- java初始化顺序
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)