适配器模式(结构型)

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

时间: 2024-10-12 15:41:25

适配器模式(结构型)的相关文章

一起学java设计模式--适配器模式(结构型模式)

适配器模式 现有一个接口DataOperation定义了排序方法sort(int[]) 和查找方法search(int[], int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法,类BinarySearch 的binarySearch(int[], int)方法实现了二分查找算法.现使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch的方法适配到DataOperation接口中.绘制类图并编程实现. (要求实现

设计模式(七):Adapter 适配器模式 -- 结构型模式

1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化.  例子1:iphone4,你即可以使用UBS接口连接电脑来充电,假如只有iphone没有电脑,怎么办呢?苹果提供了iphone电源适配器.可以使用这个电源适配器充电.这个iphone的电源适配器就是类似我们说的适配器模式.(电源适配器就是把电源变成需要的电压,也就是适配器的作用是使得一个东西适合另外一个东西.)  例子2:最典型的例

NET设计模式 第三部分 结构型模式(7):适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern) ——.NET设计模式系列之八 Terrylee,2006年2月 概述 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的.那么如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?这就是本文要说的Adapter 模式. 意图 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可

设计模式06: Adapter 适配器模式(结构型模式)

Adapter 适配器模式(结构型模式) 适配(转换)的概念无处不在:电源转接头.电源适配器.水管转接头... 动机(Motivation)在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象不能满足的.如何应对这种“迁移的变化”?如何既能够利用现有对象的良好表现,同时又能满足新的应用环境所要求的接口? 意图(Intent)将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一

跟着实例学习设计模式(8)-适配器模式adapter(结构型)

适配器模式属于结构型设计模式 设计意图:将一个类的接口转换成客户希望的另外一个接口.A d a p t e r模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 该模式正如名字一样适配器,就是为了能使之前的老接口可以焕发青春的模式,使用一个新的接口把已经存在的接口发布出去. 这样的设计模式,我们一版在企业信息化升级时会经常使用,有些企业存在的老接口经常不能对外接收数据,而重构又成本太高,那就只能使用适配器模式了,将老接口重新包装发布. 当然也有设计时就会使用的时候,大家可能不相信,不

设计模式(七) : 结构型模式--适配器模式

适配器模式主要是为了解决接口不符合系统需要的问题.分成类的适配器和对象的适配器. 1. 类的适配器: 示意性代码: package com.javadesignpattern.Adapter; public interface Target { public void sampleOperation1(); public void sampleOperation2(); } package com.javadesignpattern.Adapter; public class Adaptee {

Java经典23种设计模式之结构型模式(三)------附代理模式、适配器模式、外观模式区别

本文介绍7种结构型模式里的剩下两种:享元模式.代理模式. 一.享元模式FlyWeight 享元模式比较简单且重要,在很多场合都被用到,只不过封装起来了用户看不到.其概念:运用共享内存技术最大限度的支持大量细粒度的对象.这个概念给的有些抽象,说白了就是如果内存中存在某个对象A,如果再次需要使用对象A的时候如果内存中有A这个对象就直接使用它,不要再次new了.如果没有,则重新new一个.基于这个特点,享元模式使用时一般会给待访问对象传递一个Tag,用来标识这个对象,而且要同时使用抽象工厂的方法进行访

java-设计模式(结构型)-【适配器模式】

1.适配器(Adapter Mode) 定义:将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adapter(适配器)两个身份 目的是消除由于接口不匹配所造成的类的兼容性问题. 我们经常碰到需要将两个没有关系的类组合在一起使用,第一种方法是,修改各自的接口,但是违背了开闭原则 第二种方法是,使用Adapter,在两种接口之间创建一个混合接口(混血儿). 分类:类的适配器模式.对象的适配器模式.接口的适配器模式 1.1 类的适配器模式

结构型模式—适配器模式

定义: 将一个类(Adaptee)的接口转换成客户(Client)希望的另外一个接口(Target). 目标接口(Target):客户所期待的接口.目标可以是具体的或抽象的类,也可以是接口. 需要适配的类(Adaptee):需要适配的类或适配者类. 适配器(Adapter):使得一个东西适合另一个东西的东西.百度中定义为:接口转换器.通过包装一个需要适配的对象,把源接口转换成目标接口. 为什么要适配:需要的东西已做好,但是不能用,短时间又不能改造,想办法适配它. 作用: 使得原本由于接口不兼容而

C#设计模式之六适配器模式(Adapter Pattern)【结构型】

原文:C#设计模式之六适配器模式(Adapter Pattern)[结构型] 一.引言 从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题,那[结构型]设计模式解决的是类和对象的组合关系的问题.今天我们就开始讲[结构型]设计模式里面的第一个设计模式,中文名称:适配器模式,英文名称:Adapter Pattern.说起这个模式其实很简单,在现实生活中也有很多实例,比