java设计模式之适配器设计模式

1.定义

将一个类的接口转换成客户希望的另一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.

2.意识图

3.代码示例

原本只能对user类进行读和写操作,现在要适配成可以crud

1).实体类

package com.wyl.apapter;

import java.io.Serializable;

/**
 * 实体类
 * [email protected]
 *  2017年12月27日
 */
public class User implements Serializable{
    private String name;//姓名
    private String gender;//性别
    private int age;//年龄

    public User() {
        super();
    }
    public User(String name, String gender, int age) {
        super();
        this.name = name;
        this.gender = gender;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", gender=" + gender + ", age=" + age + "]";
    }

}

2).读写接口

package com.wyl.apapter;

import java.util.List;

/**
 * 对user进行读和写操作
 * [email protected]
 *  2017年12月27日
 */
public interface WriteAndReadUser {
    void write(List<User> users);//写
    List<User> read();//读
}

3).读写实现类

package com.wyl.apapter;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 * 读写User实现类 [email protected] 2017年12月27日
 */
public class WRUserImpl implements WriteAndReadUser {

    // 默认记录文件
    private String fileName = "user.u";

    public WRUserImpl(String fileName) {
        if (fileName != null && !"".equals(fileName)) {
            this.fileName = fileName;
        }
    }

    @Override
    public void write(List<User> users) {
        ObjectOutputStream objectOutputStream = null;
        File file=new File(fileName);
        try {
            objectOutputStream = new ObjectOutputStream(
                    new BufferedOutputStream(new FileOutputStream(file)));
            objectOutputStream.writeObject(users);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (objectOutputStream != null) {
                try {
                    objectOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    @Override
    public List<User> read() {
        ObjectInputStream objectInputStream = null;
        List<User> users=null;
        File file=new File(fileName);
        try {
            objectInputStream = new ObjectInputStream(
                    new BufferedInputStream(new FileInputStream(file)));
            users=(List<User>)objectInputStream.readObject();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(objectInputStream!=null) {
                try {
                    objectInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return users;
    }

    public static void main(String[] args) {
        //写入一条数据测试
        WRUserImpl wrUserImpl = new WRUserImpl("");

        User user = new User();
        user.setName("tm");
        user.setAge(1);
        user.setGender("男");

        List<User> users = new ArrayList<>();
        users.add(user);

        wrUserImpl.write(users);

        //读取数据测试
        List<User> list = wrUserImpl.read();
        for (User user2 : list) {
            System.out.println(user2);
        }
    }

}

4).crud接口

package com.wyl.apapter;

import java.util.List;

/**
 * user crud接口
 * [email protected]
 *  2017年12月27日
 */
public interface DBUser {
    public void addUser(User user);
    public void updateUser(User user);
    public void deleteUser(User user);
    public List<User> getUsers();
}

5).适配器

package com.wyl.apapter;

import java.util.List;

/**
 * User 适配器
 * [email protected]
 *  2017年12月27日
 */
public class UserAdapter extends WRUserImpl implements DBUser {

    public UserAdapter(String fileName) {
        super(fileName);
    }

    @Override
    public void addUser(User user) {
        List<User> users = read();
        users.add(user);
        write(users);
    }

    @Override
    public void updateUser(User user) {
        List<User> users = read();
        for(int i=0;i<users.size();i++) {
            if(users.get(i).getName().equals(user.getName())) {
                User readUser = users.get(i);
                users.remove(i);

                readUser.setAge(user.getAge());
                readUser.setGender(user.getGender());
                users.add(readUser);

                write(users);
            }
        }

    }

    @Override
    public void deleteUser(User user) {
        List<User> users = read();
        for (User user2 : users) {
            if(user2.getName().equals(user.getName())) {
                users.remove(user2);

                write(users);
            }
        }
    }

    @Override
    public List<User> getUsers() {
        return read();
    }

}

6).客户端

package com.wyl.apapter;

import java.util.List;

/**
 * 客户端类
 * [email protected]
 *  2017年12月27日
 */
public class Client {
    public static void main(String[] args) {
        //创建适配器
        UserAdapter userAdapter = new UserAdapter("");
        //添加数据
        User addUser = new User("Tomcat", "男", 29);
        userAdapter.addUser(addUser);

        //更新资源
        User userUpdate = new User("Tomcat", "男", 3);
        userAdapter.updateUser(userUpdate);

        //删除资源
        User userDelete = new User("Tomcat", "男", 3);
        userAdapter.deleteUser(userDelete);

        //遍历
        List<User> users = userAdapter.getUsers();
        for(User u:users) {
            System.out.println(u);
        }

    }

}

7).注意

  • 缺省(默认)的情况下需要在项目的根路径下创建一个 user.u 的文件.
  • 本案例涉及IO操作,实体类必须实现序列化接口
  • 对文件读的时候必须有数据,否则报错

4.总结

何时选用?

1).如果已有接口不符合你的要求,把现有实现转换为你需要的接口

2).如果想要创建可复用的类,这类可能和一些不兼容的类一起工作,需要什么就适配什么

3).想使用已存在的子类,适配其父类

原文地址:https://www.cnblogs.com/wuyanlin/p/8127610.html

时间: 2024-10-10 09:28:10

java设计模式之适配器设计模式的相关文章

设计模式之----------适配器设计模式

<?php /** **适配器模式:将需要把一类对象转化成另一类对象 **把源接口转化为目标接口 **适用范围:1.存在一个类,你想应用,接口却不是你想要的 **2. ****/ //目标接口 interface Target{ public function simpleFunction1(); public function simpleFunction2(); } //源接口 class Adaptee{ public function simpleFunction1(){ echo 's

【ThinkingInJava】12、适配器设计模式

/** * 书本:<Thinking In Java> * 功能:适配器设计模式 * 文件:Processor.java * 时间:2015年4月2日20:36:59 * 作者:cutter_point */ package Lesson9Interfaces.interfaceprocessor; public interface Processor { String name(); Object process(Object input); } /** * 书本:<Thinking

【ThinkingInJava】14、适配器设计模式 (2)

/** * 书本:<Thinking In Java> * 功能:适配器设计模式 * 文件:FilterAdapter.java * 时间:2015年4月2日20:52:07 * 作者:cutter_point */ package Lesson9Interfaces.interfaceprocessor; import Lesson9Interfaces.filters.BandPass; import Lesson9Interfaces.filters.Filter; import Les

适配器设计模式初探(Java实现)

本篇随笔主要介绍Java实现设配器设计模式. 先来看下待解决的问题: (图片转自http://blog.csdn.net/jason0539) 由上图的情况可知,欧洲壁式插座只有三足插口,如果我们想要使用的是两足插口,就需要适配器来进行转换.(适配器一面是三足插口,一面是两足插口) 适配器模式一般有两种实现方式: 1.类适配器 2.对象适配器. 先来看下类适配器的UML图:  客户端只能操纵 Target 接口的 Request 方法来进行需要的操作(当然这里就相当于调用 Request 方法使

Java设计模式之适配器

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9400141 今天一大早,你的leader就匆匆忙忙跑过来找到你:“快,快,紧急任务!最近ChinaJoy马上就要开始了,老板要求提供一种直观的方式,可以查看到我们新上线的游戏中每个服的在线人数.” 你看了看日期,不是吧!这哪里是马上要开始了,分明是已经开始了!这怎么可能来得及呢? “没关系的.”你的leader安慰你道:“功能其实很简单的,接口都已经提供好了,你只需要调用一下就行

Java读源码学设计模式:适配器Adapter

适配器模式相关源码:slf4j-1.6.1.hibernate-3.6.7 大家都知道,log4j是一个广泛使用的日志工具,除此之外,sun公司在JDK中也有自己的日志工具,也就是java.util.logging.Logger.当然还有其他一些日志工具. 多种日志工具功能和使用方式类似,一般都包含debug.info.warn.error等日志级别的方法,但却没有实现共同的接口.这一点不像JDBC,虽然关系型数据库种类很多,例如MySQL.Oracle等,但是有一套统一的接口,也就是JDBC.

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

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

Java的23种设计模式(转)

设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因

适配器设计模式

类的适配器模式 对象的适配器模式 接口的适配器模式 思想: 将类的某个接口转换成客户端期望的另一个接口表示 目的: 消除由于接口不匹配造成的类的兼容性问题 1.UML图之类的适配器设计模式 public class Source { 2. 3. public void method1() { 4. System.out.println("this is original method!"); 5. } 6.} [java] view plaincopy 1.public interfa