El entrevistador le pregunta, lo que usted ha utilizado patrones de diseño en el desarrollo de la misma? Ignoro

Los patrones de diseño no deben permanecer en teoría, combinado con negocio específico, se convertirá en más fragante ~

1. Introducción

¿Cuántos patrones de diseño que tenemos cierto conocimiento, pero a menudo también no sabíamos de qué se trata.

En un escenario de negocio real, que ha usado ningún patrones de diseño para escribir código más elegante?

El día después de haber recibido una mayor demanda de nueva gerente de productos de allí, un servicio de transporte comenzó MVC, frente a la programación SQL.

Estamos acostumbrados a usar la arquitectura MVC, en tiempo real es muy fácil crear una gran cantidad de modelo de objetos de la anemia, y luego escribir el código de procedimiento. Utilizamos un objeto, a menudo sólo soporte de datos, no hay un comportamiento lógico. Nuestro proceso de diseño, sino también comenzar a partir de un diagrama ER, centro de diseño impulsado por los datos. Una interfaz a una demanda del controlador de servicio a DAO, día tras día un CRUD.

¿Qué patrones de diseño? No existe!

Hoy en día, tratamos de diseñar el modo común (modo de fábrica, el modo proxy, modo de plantilla) en el CRUD puede caer escena, espero que podamos traer un poco de inspiración.

2. comprensión de los patrones de diseño

Los patrones de diseño (patrón de diseño), no es un producto de la imaginación de sus predecesores, pero en la práctica a largo plazo del proceso de diseño de software, después de resumen obtenidos.

Usando el diseño para hacer el patrón de código es de polimerización a alta características escalables, bajo acoplamiento.

El mundo no tendría patrones de diseño, más gente escribir código, habrá algunos patrones de diseño.

patrones de diseño orientado a objetos tiene siete principios básicos:

  • Abierto Cerrado Principio (principios básicos): Para abrir para la extensión, cerrado para la modificación
  • Solo principio Responsabilidad: Para lograr un solo responsabilidades de clase
  • Richter principio de sustitución: No destruir el sistema de herencia
  • La dependencia Inversión Principio: Interfaz de Programación Orientada
  • Interfaz Segregación Principio: Diseño de interfaces para simplificar sola
  • Synthetic principio de multiplexación / polimérico: tratar de lograr o composición polimérica antes de su uso, en segundo lugar antes de considerar el uso de la herencia para lograr
  • O al menos conocimiento de los principios de la Ley de Demeter: acoplamiento reductor

En el pasado, vamos a ir al modo de la teoría del aprendizaje, hoy diseñar, tratamos de diseñar el modo común (modo de fábrica, el modo proxy, modo de plantilla) puede caer escena de la ABM, espero que podamos traer un poco de inspiración real.

3. El patrón de diseño de casos reales

3.1 Patrón de fábrica

1) Introducción patrón de fábrica

patrón de la fábrica debe ser nuestra más familiarizados con los patrones de diseño, y los marcos tendrá una gran cantidad de xxxxFactory clásico, a continuación, para obtener el objeto de xxxFactory.create. Aquí no seguir adelante con detalle, dando un diagrama de clases patrón familiar de la fábrica debe ser capaz de recuperar hasta.

 

El entrevistador le pregunta, lo que usted ha utilizado patrones de diseño en el desarrollo de la misma?  Ignoro

 

Las ventajas de patrón de fábrica es clara:

  • Una persona que llama quiere crear un objeto, sólo sé que el nombre en él.
  • Alta escalabilidad, si desea agregar un producto, siempre y cuando la expansión de una clase de fábrica puede ser.
  • realización concreta de productos de blindaje, la persona que llama sólo se ocupa de la interfaz del producto.

Entonces, ¿cómo real de negocio de desarrollo de la planta para utilizarlo?

2) La demanda de ejemplo

Tenemos que hacer un sistemas de gestión de HBase, similar a la Navicat MySQL o banco de trabajo.

Así que hay un módulo muy importante, es darse cuenta de las adiciones y supresiones al cambio de búsqueda HBase.

El código abierto HBase-cliente ha proporcionado la API estándar ABM, ¿cómo integrarlo en el sistema?

3) código simple

@RestController("/hbase/execute")

public class DemoController {

    private HBaseExecuteService hbaseExecuteService;

    public DemoController(ExecuteService executeService) {
        this.hbaseExecuteService = executeService;
    }

    @PostMapping("/insert")
    public void insertDate(InsertCondition insertCondition) {
        hbaseExecuteService.insertDate(insertCondition);
    }

    @PostMapping("/update")
    public void updateDate(UpdateCondition updateCondition) {
        hbaseExecuteService.updateDate(updateCondition;
    }

    @PostMapping("/delete")
    public void deleteDate(DeleteCondition deleteCondition) {
        hbaseExecuteService.deleteData(deleteCondition);
    }

    @GetMapping("/select")
    public Object selectDate(SelectCondition selectCondition) {
        return hbaseExecuteService.seletData(selectCondition);
    }
}

Incrementos de una función, tiene que escribir de nuevo desde el controlador para dar servicio a una operación similar.

Dto también es necesario para construir una gran cantidad de transferencia de datos relevantes, lo que traerá una gran cantidad de duplicación de variables, tales como nombres de tabla, nombres de columna y otros criterios de búsqueda.

4) Modo de aplicación

interfaz abstracta

public interface HBaseCommand {
/**
* 执行命令
*/
ExecResult execute();
}

clase abstracta pública implementa la configuración

public class AbstractHBaseCommand implements HBaseCommand {

    Configuration configuration;

    AbstractHBaseCommand(ExecuteCondition executeCondition) {
        this.configuration = getConfiguration(executeCondition.getResourceId());
    }

    private Configuration getConfiguration(String resourceId) {
        Configuration conf = HBaseConfiguration.create();
        //做一些配置相关事情
        //。。。。
        return conf;
    }

    @Override
    public ExecResult execute() {
       return null;
    }
}

 

órdenes de producción de clase fábrica de hormigón

public class CommandFactory {

    private ExecuteCondition executeCondition;

    public CommandFactory(ExecuteCondition executeCondition) {
        this.executeCondition = executeCondition;
    }

    public HBaseCommand create() {
        HBaseCommand hBaseCommand;
        switch (ExecuteTypeEnum.getTypeForName(executeCondition.getQueryType())) {
            case Get:
                return new GetCommand(executeCondition);
            case Put:
                return new PutCommand(executeCondition);
            case Delete:
                return new DeleteCommand(executeCondition);
        }
        return null;
    }
}

Un interfaces de ejecución, una pluralidad de CRUD ejecución de comandos

public class ExecuteController {

    private ExecuteService executeService;

    public ExecuteController(ExecuteService executeService) {
        this.executeService = executeService;
    }

    @GetMapping
    public Object exec(ExecuteCondition executeCondition) {
        ExecResult execResult = executeService.execute(executeCondition);
        return transform(execResult);
    }
}

 

servicio de fábrica llamada a crear una ejecución de comandos específicos

@Service

public class ExecuteService {

    public ExecResult execute(ExecuteCondition executeCondition) {
        CommandFactory factory = new CommandFactory(executeCondition);
        HBaseCommand command = factory.create();
        return command.execute();
    }
}

 

Cada vez que se añade un nuevo comando, sólo es necesario implementar un nuevo clases relacionadas con los pedidos pueden

El entrevistador le pregunta, lo que usted ha utilizado patrones de diseño en el desarrollo de la misma?  Ignoro

 

3.2 modo proxy

1) Modo de Introducción

modo proxy también es un patrón muy familiar.

Es un objeto proporcionar un proxy por las referencias de control de objetos proxy para el objeto original. Permite que el usuario no puede comunicarse directamente con la audiencia real.

objeto proxy como un intermediario entre el cliente y el público objetivo, puede jugar más el papel, tales como la capacidad de extender el objeto original, hacer algo de corte de trabajo (registros de juego), limitar la capacidad del objeto original, además de reducir un grado por encima el acoplamiento del sistema.

 

El entrevistador le pregunta, lo que usted ha utilizado patrones de diseño en el desarrollo de la misma?  Ignoro

 

2) La demanda de ejemplo

Ya hay un objeto cliente que implementa varios métodos.

Ahora, hay dos requisitos:

  • Una esperanza ya no se admite el método de este objeto.
  • Espero que esta vez todos los métodos de ejecución de registro del cliente.

3) código simple

Para modificar la clase original

  • Eliminar el Método A (cambios incompatibles, si alguien tiene una referencia, puede compilar error)
  • Buried calcular el tiempo antes y después de cada método (la invasión de la cantidad de negocios, código, la redundancia grave)

4) Modo de aplicación

Un método para el apoyo ya, de hecho, hay un montón de maneras, la herencia o el proxy estática puede ser.

Estática código proxy:

public class ConnectionProxy implements Connection {

    private Connection connection;

    public ConnectionProxy(Connection connection) {
        this.connection = connection;
    }

    @Override
    public Admin getAdmin() throws IOException {
//抛出一个异常
        throw new UnsupportedOperationException();
    }

    @Override

    public boolean isClosed() {

        return connection.isClosed();

    }

    @Override

    public void abort(String why, Throwable e) {

        connection.abort(why, e);

    }

}

Buried para calcular después de cada método puede ser utilizado para lograr proxy dinámico.

public class TableProxy implements InvocationHandler {

    private Object target;

    public TableProxy(Object target) {
        this.target = target;
    }

    /**
     * 获取被代理接口实例对象
     *
     * @param <T>
     * @return
     */

    public <T> T getProxy() {
        return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);

    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        long current = System.currentTimeMillis();
        Object invoke;
        try {
            invoke = method.invoke(target, args);
        } catch (Throwable throwable) {
            throw throwable;
        }
        long cost = System.currentTimeMillis() - current;
        System.out.println("cost time: " + cost);
        return invoke;
    }
}

3.3 Método Plantilla

1) Modo de Introducción

marco proceso define una operación, pero algunos de los pasos específicos del retardo de proceso a las subclases implementar.

Plantilla Método subclases proceso tal sin cambiar el marco para lograr un comportamiento personalizado mediante la redefinición de ciertos pasos del algoritmo.

Por supuesto, lo más conveniente es que podemos garantizar un proceso perfecto, por lo que las diferentes subclases saben exactamente lo que necesitan para poner en práctica métodos para completar este proceso.

 

El entrevistador le pregunta, lo que usted ha utilizado patrones de diseño en el desarrollo de la misma?  Ignoro

 

2) La demanda de ejemplo

De hecho, el método de la plantilla es la más fácil de entender, pero también muy eficiente.

Nuestro método más comúnmente utilizado de una plantilla necesidades de clases es un único flujo de trabajo de aprobación.

En concreto, si ahora tenemos que definir un proceso para lograr la aprobación de una orden de trabajo, incluye la creación de órdenes de trabajo, la aprobación de la operación, la ejecución del evento, proceso de notificación de mensajes (de hecho, el proceso puede ser más complicado).

El objeto de órdenes de trabajo mucho, podría ser una señal de un servicio, una solicitud de cambio de base de datos, o una solicitud de acceso.

3) código simple

Cada proceso de orden de trabajo para escribir un conjunto de código.

  • La duplicación de esfuerzos y más;
  • El proceso puede faltar algunos aspectos clave, como después de los acontecimientos del Ejecutivo informó olvídese.

4) Modo de aplicación

Definición de una interfaz, que incluye varios métodos

public interface ChangeFlow {

    void createOrder();

    boolean approval();

    boolean execute();

    void notice();

}

En una plantilla de proceso, cosiendo diversos métodos para lograr el flujo de trabajo completa

public class MainFlow {

    public void mainFlow(ChangeFlow flow) {
        flow.createOrder();
        if (!flow.approval()){
            System.out.println("抱歉,审批没有通过");
        }
        if (!flow.execute()) {
            System.out.println("抱歉,执行失败");
        }
        flow.notice();
    }
}

Entonces, puede ser implementado en AbstractChangeFlow dentro de un método común, como la aprobación, previo aviso, todos somos la misma lógica.

public class AbstractChangeFlow implements ChangeFlow {

    @Override
    public void createOrder() {
        System.out.println("创建订单");
    }

    @Override
    public boolean approval() {
        if (xxx) {
            System.out.println("审批通过");
            return true;
        }
        return false;
    }

    @Override
    public boolean execute() {
        //交给其他子类自己复写
        return true;
    }

    @Override
    public void notice() {
        System.out.println("notice");
    }
}

 

Por último, para lograr un Excute personalizada dependiendo del método particular de órdenes de trabajo () en la línea, para lograr DbFlow, MainFlow en la línea.

El entrevistador le pregunta, lo que usted ha utilizado patrones de diseño en el desarrollo de la misma?  Ignoro

 

4. Resumen

Estudio de los patrones de diseño lo más importante es mantener el pensamiento en el desarrollo empresarial, en unos escenarios de negocios particulares, combinada con la creación del modelo de dominio y la comprensión de la escena de negocios con el fin de comprender la esencia de los patrones de diseño de pensamiento.

Si se sale de los escenarios de negocio específicos para aprender o hablar de patrones de diseño, no tiene sentido.

Algunas personas dicen, cómo distinguir entre los patrones de diseño y más de la ingeniería que?

En realidad, es muy simple.

1) negocio temprano en el diseño. Si las propiedades están muy familiarizados con el negocio, entender la dirección del negocio de iteraciones, entonces se puede hacer un poco de diseño simple.

2) proceso iterativo de negocios. Cuando el código de corrección de los necesidades de negocio cambian constantemente cuchillo, la destrucción de los siete principios de los patrones de diseño, en particular, el principio de apertura y cierre, entonces usted debe pensar en la utilización de patrones de diseño.

 

Ver aquí, el original no es fácil, un punto de preocupación, un punto como él, será mejor que leer -

restos conocimiento re-clasificar, de construcción Java mapa de conocimiento: https://github.com/saigu/JavaKnowledgeGraph (artículo de revisión histórica es muy conveniente)

Me código de exploración de número preocupación pública "señala una píldora", la primera vez para las últimas actualizaciones. Al mismo tiempo, se puede obtener un libro electrónico en masa pila libre de la tecnología Java, varios fabricantes se enfrentan a preguntas.

A las notas de la píldora

 

Supongo que te gusta

Origin www.cnblogs.com/awan-note/p/12555872.html
Recomendado
Clasificación