码迷,mamicode.com
首页 > 其他好文 > 详细

适配器模式(结构型)

时间:2016-05-07 07:01:46      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

思考问题:对于遗留系统,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()));
    }
}

技术分享

适配器模式(结构型)

标签:

原文地址:http://blog.csdn.net/petershusheng/article/details/51335868

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!