Day010-2021-08-11 多态/反射/工厂模式

第十天,学习一下工厂模式

一、多态/反射/工厂模式

当父类的引用指向子类的对象时,该对象中的方法是子类中的方法,这就是多态。反射是指根据类名字符串来制造对象。将两者结合起来,就可以做到通过改变字符串来将整个程序从一个子类的方法转换为另一个子类的方法。工厂模式就是制造一个工厂类,从配置文件中读取信息来创建特定的子类对象,以完成对程序中方法的切换。

1.1 使用

public interface 接口名 {
	public void 抽象方法();
}
public class 实现类1 implements 接口 {
	@Override
	public void 抽象方法() {
		重写方法-实现类1;
	}
}
public class 实现类2 implements 接口 {
	@Override
	public void 抽象方法() {
		重写方法-实现类2;
	}
}
import java.io.BufferedReader;
import java.io.FileReader;

public class 工厂类 {
	public 接口名 实现类对象获取方法() {
		String row = "";
		try {
			BufferedReader input = new BufferedReader(new FileReader("路径"));
			row = input.readLine();
			input.close();
			return (接口名) Class.forName(row).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}
public class 测试类 {
	public static void main(String[] args) {
		工厂类 工厂变量名 = new 工厂类();
		接口类 接口变量名 = 工厂变量名.实现类对象获取方法();
		接口变量名.抽象方法();
	}
}

1.2 练习

改进员工管理界面,使其可以在内存数据处理和文本数据处理间自由切换:

public class Employee {
	private int id;
	private String name;
	private String sex;
	private int age;
	private String department;

	public Employee(int id, String name, String sex, int age, String department) {
		super();
		this.id = id;
		this.name = name;
		this.sex = sex;
		this.age = age;
		this.department = department;
	}

	public int getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	public String getSex() {
		return sex;
	}

	public int getAge() {
		return age;
	}

	public String getDepartment() {
		return department;
	}

	@Override
	public String toString() {
		return id + "号" + sex + "员工 " + name + " , " + age + "岁在 " + department + " 工作";
	}
}
import java.util.List;

public interface EmployeeDao {
	public List<Employee> getEmployeeList();

	public void showEmployeeList();

	public Employee searchEmployeeByID(int id);

	public void addEmployee(String name, String sex, int age, String department);

	public void removeEmployeeByID(int id);

	public int getNextID();
}
import java.util.Iterator;
import java.util.List;

public class EmployeeDaoFakeImpl implements EmployeeDao {

	@Override
	public List<Employee> getEmployeeList() {
		return FakeData.employeeList;
	}

	@Override
	public void showEmployeeList() {
		FakeData.employeeList.forEach(System.out::println);
	}

	@Override
	public Employee searchEmployeeByID(int id) {
		for (Employee emp : FakeData.employeeList) {
			if (emp.getId() == id) {
				return emp;
			}
		}
		return null;
	}

	@Override
	public void addEmployee(String name, String sex, int age, String department) {
		int id = getNextID();
		FakeData.employeeList.add(new Employee(id, name, sex, age, department));
	}

	@Override
	public void removeEmployeeByID(int id) {
		Iterator<Employee> ite = FakeData.employeeList.iterator();
		while (ite.hasNext()) {
			if (ite.next().getId() == id) {
				ite.remove();
			}
		}
	}

	@Override
	public int getNextID() {
		int maxID = 0;
		for (Employee emp : FakeData.employeeList) {
			if (emp.getId() > maxID) {
				maxID = emp.getId();
			}
		}
		return maxID + 1;
	}
}
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class EmployeeDaoFileImpl implements EmployeeDao {

	@Override
	public List<Employee> getEmployeeList() {
		List<Employee> list = new ArrayList<Employee>();
		try {
			BufferedReader input = new BufferedReader(new FileReader("resource/Employee/EmployeeData"));
			String row = "";
			while ((row = input.readLine()) != null) {
				list.add(new Employee(Integer.parseInt(row.split("-")[0]), row.split("-")[1], row.split("-")[2],
						Integer.parseInt(row.split("-")[3]), row.split("-")[4]));
			}
			input.close();
			return list;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public void showEmployeeList() {
		for (Employee employee : getEmployeeList()) {
			System.out.println(employee);
		}
	}

	@Override
	public Employee searchEmployeeByID(int id) {
		for (Employee employee : getEmployeeList()) {
			if (employee.getId() == id) {
				return employee;
			}
		}
		return null;
	}

	@Override
	public void addEmployee(String name, String sex, int age, String department) {
		try {
			Writer output = new FileWriter("resource/Employee/EmployeeData", true);
			output.write(getNextID() + "-" + name + "-" + sex + "-" + age + "-" + department + "\n");
			output.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void removeEmployeeByID(int id) {
		List<Employee> list = getEmployeeList();
		Iterator<Employee> ite = list.iterator();
		while (ite.hasNext()) {
			if (ite.next().getId() == id) {
				ite.remove();
			}
		}
		try {
			Writer output = new FileWriter("resource/Employee/EmployeeData");
			for (Employee employee : list) {
				output.write(employee.getId() + "-" + employee.getName() + "-" + employee.getSex() + "-"
						+ employee.getAge() + "-" + employee.getDepartment() + "\n");
			}
			output.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public int getNextID() {
		int maxID = 0;
		for (Employee employee : getEmployeeList()) {
			if (employee.getId() > maxID) {
				maxID = employee.getId();
			}
		}
		return maxID + 1;
	}
}
import java.io.BufferedReader;
import java.io.FileReader;

public class EmployeeFactory {
	public EmployeeDao getEmployeeDao() {
		try {
			BufferedReader input = new BufferedReader(new FileReader("resource/Employee/EmployeeSettings"));
			String row = input.readLine();
			input.close();
			return (EmployeeDao) Class.forName(row).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}
import java.util.Scanner;

public class EmployeeManagement {
	private static Scanner scan = new Scanner(System.in);

	public static void main(String[] args) {
		EmployeeDao employeeDao = new EmployeeFactory().getEmployeeDao();
		System.out.println("---welcome employee management---");
		while (true) {
			System.out.println("---main menu---");
			System.out.println("0:exit the management");
			System.out.println("1:show all employee list");
			System.out.println("2:search employee by id");
			System.out.println("3:add new employee");
			System.out.println("4:remove employee by id");
			System.out.println("-------------------");
			String in = scan.next();
			if ("0".equals(in)) {
				System.out.println("exit now,please wait...");
				System.exit(0);
			} else if ("1".equals(in)) {
				System.out.println("---employee list---");
				employeeDao.showEmployeeList();
				System.out.println("----------------------");
			} else if ("2".equals(in)) {
				System.out.println("please provide an id");
				String SID = scan.next();
				Integer id = stringToInt(SID);
				if (id == null) {
					System.out.println("illegal id !");
					System.out.println("----------------------");
					continue;
				}
				Employee emp = employeeDao.searchEmployeeByID(id);
				if (emp == null) {
					System.out.println("not found !");
					System.out.println("----------------------");
				} else {
					System.out.println("---search result---");
					System.out.println(emp);
					System.out.println("---------------------");
				}
			} else if ("3".equals(in)) {
				System.out.println("please provide the name");
				String name = scan.next();
				System.out.println("please provide the sex");
				String sex = scan.next();
				System.out.println("please provide the age");
				String SAge = scan.next();
				Integer age = stringToInt(SAge);
				System.out.println("please provide the department");
				String department = scan.next();
				employeeDao.addEmployee(name, sex, age, department);
				System.out.println("add success !");
				System.out.println("----------------------");
			} else if ("4".equals(in)) {
				System.out.println("please provide an id");
				String SID = scan.next();
				Integer id = stringToInt(SID);
				if (id == null) {
					System.out.println("illegal id !");
					System.out.println("----------------------");
					continue;
				}
				Employee emp = employeeDao.searchEmployeeByID(id);
				if (emp == null) {
					System.out.println("not found !");
					System.out.println("----------------------");
				} else {
					employeeDao.removeEmployeeByID(id);
					System.out.println("remove success !");
					System.out.println("----------------------");
				}
			}
		}
	}

	public static Integer stringToInt(String str) {
		Integer id = null;
		try {
			id = Integer.parseInt(str);
		} catch (Exception e) {
			return null;
		}
		return id;
	}
}
import java.util.ArrayList;

public class FakeData {
	public static ArrayList<Employee> employeeList=new ArrayList<Employee>();
	
	static {
		employeeList.add(new Employee(1, "张老狗", "男", 35, "技术部"));
		employeeList.add(new Employee(2, "王大炮", "男", 28, "行政部"));
		employeeList.add(new Employee(3, "李狗蛋", "男", 24, "财务部"));
		employeeList.add(new Employee(4, "赵二蛋", "女", 19, "财务部"));
		employeeList.add(new Employee(5, "孙建国", "女", 26, "行政部"));
	}
}

文本数据:
文本数据

  1. 将设置文本调整为:
    设置文本
    运行结果:
    运行结果
  2. 将设置文本调整为:
    设置文本
    运行结果:
    运行结果
    与内存数据相比,文本数据能够长久保存操作结果:
    数据结果
new FileReader("resource/Employee/EmployeeData");

这里的路径采用的是相对路径,要求文件放在工程的文件夹下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值