【Patrón de diseño】 Con solo tres minutos de experiencia, comprenderá los patrones de Fachada y Mediador tanto como yo.

Patrón de fachada de fachada

Escena de simulación

Hay Clientuno, que necesita ser instalado en la ciudad, y el registro de la casa necesita ser transferido, ahora los departamentos correspondientes requieren Clientla preparación de una serie de materiales.

Simplifiquemos el departamento, asumiendo que solo necesitamos ejecutar 材料部门, 核验盖章部门y 制证发证部门tres departamentos.

Ahora debe Clientobtener 材料部门los materiales primero, luego completarlos y finalmente obtener el certificado 核验部门盖章con los materiales cubiertos , de modo que el negocio pueda considerarse completo cuando el conjunto se complete en orden.制证部门

simulación de código

Departamento de Materiales

/**
 * 材料部门,给办证者提供必要的材料
 * @author 行百里者
 */
public class StuffDept {
    public void makeStuff() {
        //处理业务逻辑
        System.out.println("制作相关材料,并发给Client填写");
    }
}

Departamento de sellos

/**
 * 检查核验部门,核验通过才给盖章
 * @author 行百里者
 */
public class CheckDept {
    public void checkStuff() {
        //处理业务逻辑
        System.out.println("核查材料的准确性,核查通过才给盖章");
    }
}

Departamento de Certificación

/**
 * 发证部门
 * @author 行百里者
 */
public class IssueDept {
    public void issueCert() {
        //处理业务逻辑
        System.out.println("发证部门检验材料是否盖章,然后制证发证");
    }
}

ClientEscenarios de procesamiento que requieren certificación :

public class Client {
    public static void main(String[] args) {
        //一定要按照这个顺序去办证,否则拿不到证
        StuffDept sd = new StuffDept();
        sd.makeStuff();
        CheckDept cd = new CheckDept();
        cd.checkStuff();
        IssueDept id = new IssueDept();
        id.issueCert();
    }
}

De hecho, en la vida real, podemos ejecutar mucho más que estos tres departamentos. Si nos movemos de un lado a Clientotro entre N departamentos, ¡la eficiencia del trabajo no es una basura!

Resuelve este difícil problema con el modo fachada.

Afortunadamente, muchos lugares ahora brindan canales en línea para manejar algunos negocios. ClientSolo necesita ejecutar una vez y Clientsolo necesita tratar con 网上通道- .NetApp

/**
 * “中国式办证”所需的“门面”部门,负责统一处理各部门的事情,
 * Client只需要调“门面”的doItJustOnce方法即可
 * @author 行百里者
 */
public class NetApp {
    private StuffDept stuffDept = new StuffDept();
    private CheckDept checkDept = new CheckDept();
    private IssueDept issueDept = new IssueDept();
    
    public void doItJustOnce() {
        stuffDept.makeStuff();
        checkDept.checkStuff();
        issueDept.issueCert();
    }
}

Clientllamar

public class Client {
    public static void main(String[] args) {
        NetApp facade = new NetApp();
        facade.doItJustOnce();
    }
}

Porque Client, ¿no es refrescante?

¿No es esto solo otra capa de encapsulación? Así es, este es el patrón de fachada , que resuelve el Clienttedioso problema de hacer llamadas a varios departamentos y llamarlos en el orden especificado.

Fachada Déjà Vu

API de pago Alipay

La parte de acceso solo necesita llamar, sin importar cómo se implemente internamente, solo necesita intercambiar datos de acuerdo con su API abierta.

La API abierta de Alipay puede entenderse como una aplicación del modelo Facade.

marco de registro SLF4J

El marco de registro de SLF4J adopta el patrón de diseño de fachada, que oculta la complejidad del sistema desde el exterior y proporciona una interfaz unificada para el cliente o programa llamado externamente.

private static final Logger LOGGER = LoggerFactory.getLogger(Provider.class);

public String doSomething() {
    LOGGER.info("service name:{}", serviceName);
}

一句话就可以直接输出日志信息,而不管其内部是Log4j实现的还是logback实现的,用起来就是简单明了。

JDBC数据库操作

数据库JDBC的操作,例如:

@Component
public class DBUtil {

    private static String URL;

    private static String DRIVER;

    private static String USERNAME;

    private static String PASSWORD;

    private static Connection connection = null;

    private static final Logger LOGGER = LoggerFactory.getLogger(DBUtil.class);


    /**
     * 获取JDBC连接
     *
     */
    public static Connection getConnection() {
        try {
            //加载驱动程序:它通过反射创建一个driver对象。
            Class.forName(DRIVER);

            //获得数据连接对象。
            connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
            return connection;
        } catch (Exception e) {
            e.printStackTrace();
            LOGGER.error("获取JDBC连接异常, {}", e.getMessage());
        }
        return null;
    }

    @Value("${db.dburl}")
    public void setURL(String dburl) {
        URL = dburl;
    }

    @Value("${db.dbdriver}")
    public void setDRIVER(String dbdriver) {
        DRIVER = dbdriver;
    }

    @Value("${db.dbusername}")
    public void setUSERNAME(String dbusername) {
        USERNAME = dbusername;
    }

    @Value("${db.dbpassword}")
    public void setPASSWORD(String dbpassword) {
        PASSWORD = dbpassword;
    }
}

获取数据库连接的时候,只需要传入driver的驱动类名称即可,如果以后我们更换Class.forName中的 driver 非常方便,比如从MySQL数据库换到Oracle数据库,只要更换facade中的driver就可以。

Mediator 调停者模式

有的地方把它叫做中介者模式,名字不重要!!!

张三的烦恼

张三的老婆发现他最近有点异常,怀疑张三和他前女友藕断丝连,于是张老婆去找张三他妈评理,但是俩人很快吵起来了,此时小姑子出现了,又是一顿吵,是互相吵的那种。

张三恼了,和其他三人也吵起来了。

他很想结束现状,但是他已无能为力,甚至自己也陷入其中,要是居委会大妈在就好了!!!

居委会大妈的职责就是协调他们内部的事情,有什么事直接跟我说,保证把你们的事情都解决!!!

居委会大妈就是调停者,中介者。

模拟现场

调停者

加入了一个中介者作为四个模块的交流核心,每个模块之间不再相互交流,要交流就通过中介者居委会大妈进行。每个模块只负责自己的业务逻辑,不属于自己的则丢给中介者来处理,简化了各模块之间的耦合关系。

消息中间件

卧槽,中介处理各个模块的需求,而且各个模块之间不需要通信,消息中间件不就是这种模式吗?

对!MQ就可以理解为Mediator模式

调停者模式的优缺点

  • 优点

中介者模式的优点就是减少类间的依赖,把原有的一对多的依赖变成了一对一的依赖,减少了依赖,当然同时也降低了类间的耦合。

  • 缺点

中介者模式的缺点就是中介者会膨胀得很大,而且逻辑复杂,,中介者的逻辑就越复杂。

好了,你已经会门面模式调停者模式了。下一个!!!

Supongo que te gusta

Origin juejin.im/post/7118574813551001631
Recomendado
Clasificación