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).想使用已存在的子类,适配其父类