java設計模式之適配器設計模式
阿新 • • 發佈:2017-12-27
col puts 另一個 ble png 實現 bubuko 姓名 tput
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).想使用已存在的子類,適配其父類
java設計模式之適配器設計模式