Modelo intermediario
Escenarios de aplicación
- Existen relaciones de referencia relativamente complicadas entre los objetos en el sistema, lo que conduce a una estructura de relación de dependencia caótica entre ellos y es difícil reutilizar el objeto.
- Quiere encapsular el comportamiento en varias clases a través de una clase intermedia, pero no quiere generar demasiadas subclases
Modelo intermediario
definición
Envuelve la forma en que interactúan una serie de objetos, de modo que estos objetos no tienen que referirse entre sí de manera obvia, lo que los hace relativamente poco acoplados.
Principio de diseño: ley de Dimit
intención
Use un objeto intermediario para encapsular una serie de interacciones de objetos, el intermediario hace que estos objetos no tengan que referirse entre sí de manera obvia, lo que los hace relativamente poco acoplados y puede cambiar de forma independiente la interacción entre ellos
Principalmente resuelve el problema
Hay muchas asociaciones entre los objetos del sistema, lo que hará que la estructura del sistema se vuelva complicada. Si un objeto cambia, debe rastrear los objetos asociados con él.
Cuándo usar
Varias clases se acoplan entre sí para formar una estructura de red, y la estructura de red debe convertirse en una estructura en estrella.
Estructura de la red:
estos objetos afectarán a otros objetos y se verán afectados por otros objetos, por lo que a menudo se les llama objetos colega.Como se puede ver en la figura, casi todos los objetos interactúan con otros objetos.Este es un sistema acoplado excesivo.
Estructura en estrella:
Al introducir el objeto intermediario, la estructura de red del sistema se puede convertir en una estructura en estrella. Se puede ver que los objetos colega ya no tienen contacto directo con otros objetos, y se garantiza la existencia del objeto intermediario. La estructura del objeto es estable, es decir, el sistema no causará mucho trabajo de modificación debido a la introducción de nuevos objetos.
Pros y contras
ventaja:
- Reducir la complejidad de la clase, transformar uno a varios en uno a uno
- Desacoplamiento entre clases
- De acuerdo con los principios de diseño: Ley de Dimit
Desventajas:
- Aumentó la complejidad de la clase intermedia.
Diagrama de estructura:
Roles involucrados:
- Función de mediador abstracto (Mediator): define la interfaz del objeto colega al objeto mediador. El método principal es uno o más métodos de evento. Esta función generalmente se implementa mediante una clase abstracta de Java o un objeto de Java
- Rol de ConcreteMediator: Implementa el método de evento declarado por el rol de mediador abstracto. El rol de mediador concreto conoce todas las clases de colega específicas. Recibe mensajes de clases de colega específicas y emite comandos a objetos de colega específicos. Implementación de clase de Java específica
- Rol de clase de colega abstracto (colega): define la interfaz del intermediario al objeto colega, el objeto colega solo conoce al intermediario pero no a otros objetos colega
- Rol del colega concreto: cada colega concreto conoce su propio comportamiento en un rango pequeño, pero no conoce su propósito en un rango grande.
El código fuente correspondiente es el siguiente:
public abstract class Mediator {
/** 事件方法,由子类实现 */
public abstract void colleagueChanged(Colleague colleague);
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
mediator.create();
Colleague colleague1 = new Colleague1(mediator);
Colleague colleague2 = new Colleague2(mediator);
mediator.colleagueChanged(colleague1);
}
}
public class ConcreteMediator extends Mediator {
private Colleague1 colleague1;
private Colleague2 colleague2;
@Override
public void colleagueChanged(Colleague colleague) {
colleague1.action();
colleague2.action();
}
/** 创建同事对象 */
public void create() {
colleague1 = new Colleague1(this);
colleague2 = new Colleague2(this);
}
/** 提供同事对象 */
public Colleague1 getColleague1() {
return colleague1;
}
/** 提供同事对象 */
public Colleague2 getColleague2() {
return colleague2;
}
}
public abstract class Colleague {
private Mediator mediator;
/** 参量:中介者对象 */
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
/** 取值方法 */
public Mediator getMediator() {
return mediator;
}
/** 行动方法,由子类实现 */
public abstract void action();
/** 可以改变对象的内部状态 */
public void change() {
mediator.colleagueChanged(this);
}
}
public class ConcreteColleague extends Colleague {
/**
* 参量:中介者对象
*
* @param mediator
*/
public ConcreteColleague(Mediator mediator) {
super(mediator);
}
@Override
public void action() {
System.out.println("实现了行动方法");
}
}
Organización Mundial del Comercio OMT
La Organización Mundial del Comercio (Inglés: Organización Mundial del Comercio), conocida como la Organización Mundial del Comercio (OMC), es una organización internacional permanente independiente de las Naciones Unidas. La función de la Organización Mundial del Comercio es mediar en las disputas. La adhesión a la OMC no cuenta como la firma de un acuerdo comercial multilateral. Es la base organizativa y jurídica del sistema comercial, el administrador de numerosos acuerdos comerciales, el supervisor de la legislación comercial de cada miembro y el lugar para la solución de controversias y la negociación comercial. Por
ejemplo, cuando no hay OMC, el relación entre varios países El intercambio comercial es así:
Después de la OMC, el intercambio comercial se ha convertido como se muestra en la siguiente figura:
Escena pequeña:
Los tres países de China, Francia y Corea del Sur deben comerciar a través de la OMC. El té chino debe exportarse a Francia y Corea del Sur, el foie gras francés debe exportarse a China y Corea del Sur, y el kimchi coreano debe exportarse a China y Francia.
La organización de la OMC, el intermediario abstracto:
define dos interfaces, la adhesión a la OMC y los intercambios comerciales:
public interface WTOMediator {
/** 加入WTO */
void addWTO(Countries countries);
/** 贸易往来 */
void trade(Countries countries);
}
El intermediario específico implementa la interfaz anterior y define cómo unirse a la OMC y cómo realizar transacciones comerciales:
public class ConcreteWTOMediator implements WTOMediator {
private List<Countries> countriesList = new ArrayList<>();
@Override
public void addWTO(Countries countries) {
if (!countriesList.contains(countries)) {
countries.setWtoMediator(this);
this.countriesList.add(countries);
}
}
@Override
public void trade(Countries countries) {
countriesList.forEach(v -> {
if(!v.equals(countries)) {
v.receive();
}
});
}
}
Categoría colega abstracto, conoce la existencia de la OMC, pero desconoce la existencia de otros países:
public abstract class Countries {
public WTOMediator wtoMediator;
/** 贸易进口 */
public abstract void receive();
/** 贸易出口 */
public abstract void send();
public void setWtoMediator(WTOMediator wtoMediator) {
this.wtoMediator = wtoMediator;
}
}
China, Francia y Corea del Sur deben implementar la interfaz anterior:
public class China extends Countries {
@Override
public void receive() {
System.out.println("贸易出口到中国");
}
@Override
public void send() {
System.out.println("中国茶叶出口了!");
this.wtoMediator.trade(this);
}
}
public class French extends Countries {
@Override
public void receive() {
System.out.println("贸易出口到法国");
}
@Override
public void send() {
System.out.println("法国鹅肝出口了!");
this.wtoMediator.trade(this);
}
}
public class Korea extends Countries {
@Override
public void receive() {
System.out.println("贸易出口到韩国");
}
@Override
public void send() {
System.out.println("韩国泡菜出口了!");
this.wtoMediator.trade(this);
}
}
La siguiente es la categoría de prueba, es decir, se inicia la transacción comercial:
public class Test {
public static void main(String[] args) {
//构建WTO中介者
WTOMediator mediator = new ConcreteWTOMediator();
//构建具体的同事类,即各个国家
Countries china = new China();
Countries french = new French();
Countries korea = new Korea();
//加入WTO
mediator.addWTO(china);
mediator.addWTO(french);
mediator.addWTO(korea);
china.send();
System.out.println();
french.send();
System.out.println();
korea.send();
}
}
Diagrama de clases:
Nota:
- El modelo intermediario no debe utilizarse cuando la división de responsabilidades es caótica
- No se debe utilizar para clases de datos y clases de métodos.
- Necesita comprender la encapsulación correctamente
Patrones de diseño relacionados con el patrón intermedio:
- Modo de apariencia
- Modo de observador
- Modo adaptador
Después de leer los cuatro modos anteriores, piense en las similitudes y diferencias.