委派模式

2020-06-24  本文已影响0人  强某某

代码:简单案例

public interface IEmployee {
    public void doing(String command);
}
public class EmployeeA implements IEmployee {
    @Override
    public void doing(String command) {
        System.out.println("员工A,擅长加密");
    }
}
public class EmployeeB implements IEmployee {
    @Override
    public void doing(String command) {
        System.out.println("员工B,擅长架构");
    }
}
public class Leader {
    private Map<String,IEmployee> register=new HashMap<>();
    public Leader() {
        register.put("加密",new EmployeeA());
        register.put("架构",new EmployeeB());
    }
    public void doing(String command) {
        register.get(command).doing(command);
    }
}
public class Boss {
    public void command(String command,Leader leader) {
            leader.doing(command);
    }
}
public class DelegateTest {
    public static void main(String[] args) {
    //重要:委派模式更偏向于结果,而策略模式强调可替换,所以一般会多出一个抽象或者接口
        new Boss().command("加密",new Leader()); //员工A,擅长加密
    }
}
1.jpg

MVC小案例

public class DispatcherServlet extends HttpServlet {
    private List<Handler> handlerList = new ArrayList<>();

    @Override
    public void init() throws ServletException {
        try {
        
        //此处根据反射动态创建,而且例如spring应该是读取配置文件,然后for形式添加
            Class<MemberController> memberControllerClass = MemberController.class;
            handlerList.add(new Handler().setController(memberControllerClass.newInstance())
                    .setMethod(memberControllerClass.getMethod("getMemberById", new Class[]{String.class}))
                    .setUrl("/web/getMemberById.json"));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doDiapatch(req, resp);
    }

    private void doDiapatch(HttpServletRequest req, HttpServletResponse resp) {
        String uri = req.getRequestURI();
        Handler handler=null;
        for (Handler h : handlerList) {
            if (uri.equals(h.getUrl())) {
                handler=h;
                break;
            }
        }
        try {
           Object obj= handler.getMethod().invoke(handler.getController(),req.getParameter("mid"));
            resp.getWriter().write(obj.toString());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

//    private void doDiapatch(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//        String uri = req.getRequestURI();
//        String mid = req.getParameter("mid");
//        if ("getMemberById".equals(uri)) {
//            new MemberController().getMemberById(mid);
//        } else if ("getOrderById".equals(uri)) {
//            new OrderController().getOrderById(mid);
//        } else if ("logout".equals(uri)) {
//            new SystemController().logout();
//        }else{
//            resp.getWriter().write("404 Not Found");
//        }
//    }


    class Handler {
        private Object controller;
        private Method method;
        private String url;

        public Object getController() {
            return controller;
        }

        public Handler setController(Object controller) {
            this.controller = controller;
            return this;
        }

        public Method getMethod() {
            return method;
        }

        public Handler setMethod(Method method) {
            this.method = method;
            return this;
        }

        public String getUrl() {
            return url;
        }

        public Handler setUrl(String url) {
            this.url = url;
            return this;
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读