我们都知道设计模式有一个责任链模式,责任链模式是知道前后要执行的步骤,而处理链是不知道的,下面看一下代码:
首先创建一个处理链的对象类
package listhandle; import java.util.ArrayList; import java.util.List; /** * 处理链的对象类 * @auther QiaoZhenwu * @date 2017年1月12日 下午3:33:07 */ public class ServiceHandler { private String serviceType;//服务类型 private List<String> serviceList = new ArrayList<String>();//服务链 private String serviceListener; public ServiceHandler(String serviceType, String serviceListener){ this.serviceType = serviceType; this.serviceListener = serviceListener; } public ServiceHandler addHandler(String handler) { serviceList.add(handler); return this; } public String getServiceType() { return serviceType; } public void setServiceType(String serviceType) { this.serviceType = serviceType; } public List<String> getServiceList() { return serviceList; } public void setServiceList(List<String> serviceList) { this.serviceList = serviceList; } public String getServiceListener() { return serviceListener; } public void setServiceListener(String serviceListener) { this.serviceListener = serviceListener; } }
然后,写一个接口,让需要实现功能的类去实现这个接口
package listhandle; /** * * @auther QiaoZhenwu * @date 2017年1月12日 下午3:54:05 */ public interface Test { public void handle(User u) throws Exception ; }
几个接口的实现类,分别实现自己不同的功能
package listhandle; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * * @auther QiaoZhenwu * @date 2017年1月12日 下午3:47:06 */ public class Test1 implements Test { public void handle(User u) throws Exception { System.out.print("我是Test1******"); u.setID("37028218154514551"); Class clazz = u.getClass(); Field[] fields = u.getClass().getDeclaredFields();// 获得属性 for (Field field : fields) { PropertyDescriptor pd; try { pd = new PropertyDescriptor(field.getName(), clazz); Method getMethod = pd.getReadMethod();// 获得get方法 Object o = getMethod.invoke(u);// 执行get方法返回一个Object System.out.print(field.getName() + ":" + o + "--"); } catch (Exception e) { e.printStackTrace(); } } System.out.println(); } }
package listhandle; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * * @auther QiaoZhenwu * @date 2017年1月12日 下午3:47:12 */ public class Test2 implements Test { public void handle(User u) throws Exception { System.out.print("我是Test2******"); u.setHigher("1.78"); Class clazz = u.getClass(); Field[] fields = u.getClass().getDeclaredFields();// 获得属性 for (Field field : fields) { PropertyDescriptor pd; try { pd = new PropertyDescriptor(field.getName(), clazz); Method getMethod = pd.getReadMethod();// 获得get方法 Object o = getMethod.invoke(u);// 执行get方法返回一个Object System.out.print(field.getName() + ":" + o + "--"); } catch (Exception e) { e.printStackTrace(); } } System.out.println(); } }
package listhandle; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * * @auther QiaoZhenwu * @date 2017年1月12日 下午3:47:22 */ public class Test3 implements Test { public void handle(User u) throws Exception { System.out.print("我是Test3******"); u.setWeight("60KG"); Class clazz = u.getClass(); Field[] fields = u.getClass().getDeclaredFields();// 获得属性 for (Field field : fields) { PropertyDescriptor pd; try { pd = new PropertyDescriptor(field.getName(), clazz); Method getMethod = pd.getReadMethod();// 获得get方法 Object o = getMethod.invoke(u);// 执行get方法返回一个Object System.out.print(field.getName() + ":" + o + "--"); } catch (Exception e) { e.printStackTrace(); } } System.out.println(); } }
一个User的对象类
package listhandle; /** * User对象类 * @auther QiaoZhenwu * @date 2017年1月12日 下午4:26:41 */ public class User { private String ID; private String higher; private String weight; private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getID() { return ID; } public void setID(String iD) { ID = iD; } public String getHigher() { return higher; } public void setHigher(String higher) { this.higher = higher; } public String getWeight() { return weight; } public void setWeight(String weight) { this.weight = weight; } }
最后一个测试类
package listhandle; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; /** * 处理链的测试类 * @auther QiaoZhenwu * @date 2017年1月12日 下午3:47:52 */ public class ServiceChain { public static final String ROUTE = "listhandle";// 包路径 public static final String meName = "handle";// 接口方法名 public List<ServiceHandler> adapters() { List<ServiceHandler> lis = new ArrayList<>(); lis.add(new ServiceHandler("purchase", "listener") .addHandler(Test1.class.getSimpleName()) .addHandler(Test2.class.getSimpleName()) .addHandler(Test3.class.getSimpleName())); lis.add(new ServiceHandler("cancel", "listener") .addHandler(Test1.class.getSimpleName()) .addHandler(Test3.class.getSimpleName()) .addHandler(Test2.class.getSimpleName())); return lis; } public void getHandler(String serviceType) { List<ServiceHandler> lis = adapters();//设置两种执行顺序 User u = new User(); u.setName("qzw"); u.setAge(26); lis.forEach(l -> { if (l.getServiceType().equals(serviceType)) { l.getServiceList().forEach(sl -> { if(sl.equals("Test1")){ u.setID("37028218154514551"); }else if(sl.equals("Test2")){ u.setHigher("1.78"); }else if(sl.equals("Test3")){ u.setWeight("60KG"); } try { Object obj = Class.forName(ROUTE + "." + sl).newInstance(); Class cls = obj.getClass(); Method me = cls.getDeclaredMethod(meName, User.class); Class<?>[] pt = me.getParameterTypes(); if (!me.getName().startsWith("set") && !me.getName().startsWith("get")) { for(Class c: pt){ Method method = cls.getMethod(meName, c); method.invoke(obj, u); } } } catch (Exception e) { e.printStackTrace(); } }); } }); } public static void main(String[] args) { new ServiceChain().getHandler("purchase"); System.out.println("================================================================================"); new ServiceChain().getHandler("cancel"); } }
这样就实现了一个简单的处理连,
在测试类的adapters根据需求写多个不同的处理链,可以按照需要设定不同的执行顺序
本文出自 “my dream fly on the sky” 博客,请务必保留此出处http://7915791.blog.51cto.com/7905791/1902557
原文:http://7915791.blog.51cto.com/7905791/1902557