Definición: el cliente no debe depender de las interfaces que no requiere; La dependencia de una clase en otra debe establecerse en la interfaz más pequeña.
El problema se origina: la clase A depende de la clase B a través de la interfaz I, y la clase C depende de la Clase D a través de la interfaz I. Si la interfaz I no es la interfaz más pequeña para la Clase A y la Clase B, entonces la Clase B y la Clase D deben implementar los métodos que no necesitan.
Solución: divida la interfaz hinchada I en varias interfaces independientes, y la clase A y la clase C establecen dependencias con las interfaces que necesitan respectivamente. Es decir, se adopta el principio de aislamiento de la interfaz.
Damos un ejemplo para ilustrar el principio de aislamiento de la interfaz:
El significado de esta figura es: la clase A depende de los métodos 1, el método 2, el método 3 en la interfaz I, y la clase B es una implementación de la dependencia de la clase A. La clase C depende del método 1, el método 4, el método 5 en la interfaz I, y la clase D es una implementación de dependencia de la clase C. para la clase B y D, aunque ambos no tienen métodos no utilizados (es decir, métodos marcados con las fuentes cotizadas en la Figura), ya que se implementan los métodos de la clase I, los que se implementan.
Primero veamos un ejemplo de violación del aislamiento de la interfaz:
interfaz pública iworker {public void work (); público vacío comer (); } Public Class Worker implementa iWorker {@Override public void Work () {// TODO Worker Work} @Override public void eat () {// TODO Worker Eat}} public class Robot implementos {@Override public void Work () {// TODO Robot Work} @Override Void Void void Eat () {/////1 Robot. }}
Dado que los robots no necesitan comer, Iworker se considera una interfaz hinchada. Por supuesto, también puede implementar a corto plazo del método EAT en la clase de robot, pero esto puede causar errores impredecibles. Por ejemplo, si el método EAT necesita consumir la cantidad de loncheras, habrá un fenómeno incorrecto.
La siguiente es la implementación modificada:
interfaz pública iworker {public void work (); } interfaz pública idiet {public void eat (); } Public Class Worker implementa iWorker, Idiet {@Override public void Work () {// toDo Work} @Override public void eat () {// TODO Work}} Public Class Robot implementa IWorker {@Override public void Work () {// TODO ROBOT Work}}
Resumir:
1. La interfaz debe ser lo más pequeña posible y altamente cohesiva, pero debe ser apropiada, demasiado detallada y difícil de mantener.
2. Si se ha diseñado como una interfaz hinchada, se puede aislar utilizando el modo adaptador.