适配器模式(结构型)

来源:互联网 发布:淘宝理财产品 财富宝 编辑:程序博客网 时间:2024/06/05 20:34

思考问题:对于遗留系统,service已经存在了,controller层却假定service层会提供add(User u)方法新增用户,而实际上service层声明的却是insert(User u)来新增用户,在controller层和service层对接时才发现该问题,在不修改已有代码的前提下,你该如何完成对接?


解答:有两种方式:

  1. 继承;
  2. 组合(不理解可以继续看下去);

    首先讲大家熟悉的继承方式,结合问题,就是让一个适配器类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
原创粉丝点击