patrones de diseño Java ---- modo de delegado, utilizan todos los días, pero no saben el patrón, línea de mano y la primavera

modo de Delegado (Patrón Delegado):

La función básica es responsable de la programación de tareas y asignar tareas, al igual que con el modo de proxy, puede ser visto como una aproximación estática en un caso especial de agente exclusivo, pero el modelo de agente se centra en el proceso más delegar enfoques modelo sobre los resultados.

No pertenece a uno de los patrones de diseño gof23.

Pertenecer patrones de comportamiento.

escena de la realidad:

El jefe hacer algo, simplemente explicar al director, el director puede ser distribuida a los empleados correspondientes

código:

/**
 * @Author Darker
 * @Descrption 老板
 * @Date : Created in 10:37 2020-3-12
 */
public class Boss {

    //委派什么任务给经理
    public void delegate(String task,Leader leader){
        leader.doing(task);
    }
}

/**
 * @Author Darker
 * @Descrption  被委派的经理,存储他统管的所有员工
 * @Date : Created in 10:37 2020-3-12
 */
public class Leader {
    //要知道每个员工的特长何特征
    private Map<String,IEmployee> register = new HashMap<>();

    public Leader(){
        register.put("数据库",new Aemployee());
        register.put("业务逻辑",new Bemployee());
    }

    //分配对应的任务给对应的员工
    public void doing(String task){
        register.get(task).doingSomeThings(task);
    }
}

/**
 * @Author Darker
 * @Descrption 员工抽象
 * @Date : Created in 10:38 2020-3-12
 */
public interface IEmployee {

    public void doingSomeThings(String task);
}

/**
 * @Author Darker
 * @Descrption
 * @Date : Created in 10:39 2020-3-12
 */
public class Aemployee implements IEmployee{
    @Override
    public void doingSomeThings(String task) {
        System.out.println("我是a员工,我负责做数据库的工作,我做了"+task+"任务");
    }
}

/**
 * @Author Darker
 * @Descrption
 * @Date : Created in 10:40 2020-3-12
 */
public class Bemployee implements IEmployee{
    @Override
    public void doingSomeThings(String task) {
        System.out.println("我是b员工,我负责做业务开发的工作,我做了"+task+"任务");
    }
}

 Los resultados:

Ahora el jefe tiene que delegar funciones en el gestor de bases de datos, obtener retroalimentación

/**
 * @Author Darker
 * @Descrption
 * @Date : Created in 10:57 2020-3-12
 */
public class DelegateTest {
    public static void main(String[] args) {
        new Boss().delegate("数据库",new Leader());
    }
}

 

Análisis, el jefe es equivalente a la demanda, ahora hay un gerente para ayudar a las tareas de distribución de la clase jefe, por lo que los gerentes necesitan saber todos los empleados y cada empleado tarea correspondiente con un mapa privado de todos los empleados y tener la tarea correspondiente, cuando el ingreso cuando una tarea, puede programar rápidamente las tareas que corresponden a los empleados correspondientes, este modelo es un poco como agente estático.

La relación entre las clases:

 

 

Entonces la pregunta es, ¿Dónde está el código que escribimos será utilizada para el modo de delegar, no se preocupa nos fijamos en un código de lectura sabrá.

/**
 * @Author Darker
 * @Descrption 请求处理Servlet
 * @Date : Created in 11:14 2020-3-12
 */
public class DispatcherServlet extends HttpServlet{

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

    public void delegate(HttpServletRequest req, HttpServletResponse resp){
        String reqUrl = req.getRequestURI();

        if ("getOrderById".equals(reqUrl)){
            new OrderController().getOrderById();
        }else if("logout".equals(reqUrl)){
            new SystemController().logout();
        }else{
            System.out.println("访问路径不存在 404");
        }
    }
}

/**
 * @Author Darker
 * @Descrption 订单业务Controller
 * @Date : Created in 11:15 2020-3-12
 */
public class OrderController {

    public void getOrderById(){

    }
}

/**
 * @Author Darker
 * @Descrption 系统操作Controller
 * @Date : Created in 11:28 2020-3-12
 */
public class SystemController {

    public void logout(){

    }
}

Yo no encontré, entramos para acceder a la dirección del navegador son tanto servlet, servlet que ayudan y luego se reparten entre el servicio al que desea llamar y decidir qué método se invoca, este no es el patrón de estrategia aquí, escribimos el código anterior es una lógica de asignación simple.

Bueno, este es el modelo de delegado, y es un número relativamente simples patrones de diseño, sino también otros modos combinados con la optimización del código juega un papel vital.

Y agregó:

El tratamiento final por encima de un poco áspero, por lo que me refiero fuente de la primavera ha hecho algunos suplementos, primavera pensar está aprendiendo a escribir, aquí está el código mejorado.

/**
 * @Author Darker
 * @Descrption 请求处理Servlet
 * @Date : Created in 11:14 2020-3-12
 */
public class DispatcherServlet extends HttpServlet{

    private List<Handler> handlerMapping = new ArrayList<>();

    
    //初始化的时候把controller和访问路径,方法绑定在一个list里面
    @Override
    public void init() throws ServletException {
        Class<?> orderControllerClass =  OrderController.class;
        try {
            handlerMapping.add(new Handler()
                            .setController(orderControllerClass.newInstance())
                            .setMeThod(orderControllerClass.getMethod("getOrderById"))
                            .setUrl("/web/getMemberById.json")
                                );
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

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

    public void delegate(HttpServletRequest req, HttpServletResponse resp){
        String reqUrl = req.getRequestURI();
        Handler handler = null;
        for(Handler h :handlerMapping){
            if(reqUrl.equals(h.getUrl())){
                handler = h;
                break;
            }
        }

        try {
            Object o = handler.getMeThod().invoke(handler.getController(),null);
            try {
                resp.getWriter().write(o.toString());
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }



       /* if ("getOrderById".equals(reqUrl)){
            new OrderController().getOrderById();
        }else if("logout".equals(reqUrl)){
            new SystemController().logout();
        }else{
            System.out.println("访问路径不存在 404");
        }*/
    }

    //绑定的类,模仿lombok的链式调用
    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;
        }
    }
}

 

Publicado 27 artículos originales · ganado elogios 1 · vistas 3643

Supongo que te gusta

Origin blog.csdn.net/qq_40111437/article/details/104811403
Recomendado
Clasificación