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


    1.定义

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

    2.意识图

     

    3.代码示例

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

     

    1).实体类

    package com.wyl.apapter;
    
    import java.io.Serializable;
    
    /**
     * 实体类
     * wuyanlin2016@163.com
     *  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进行读和写操作
     * wuyanlin2016@163.com
     *  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实现类 wuyanlin2016@163.com 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接口
     * wuyanlin2016@163.com
     *  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 适配器
     * wuyanlin2016@163.com
     *  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;
    
    /**
     * 客户端类
     * wuyanlin2016@163.com
     *  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).想使用已存在的子类,适配其父类

     

  • 相关阅读:
    Linux 文件特殊权限 SUID SGID SBIT
    Oracle Flashback 详解
    Oracle RMAN备份与还原注意事项
    Linux df 与du用法
    Oracle RMAN备份与还原
    Oracle 不小心删除undo数据文件以及磁盘空间不足导致不能登录的解决办法
    Oracle 内存参数调优设置
    Oracle Profile 配置文件
    关于php语言的使用!
    分享几个Javascript 封装方法
  • 原文地址:https://www.cnblogs.com/wuyanlin/p/8127610.html
Copyright © 2020-2023  润新知