Cuando se codifican a una determinada aplicación , si necesita cambiar el subyacente objeto Su código más probable ruptura, debido a que el nuevo objeto puede no responder a los mismos métodos.
lo tanto, para poner un ejemplo claro:
Si necesita llevar a cabo una serie de objetos que podría haber decidido utilizar un Vector.
Si necesita acceder al primer objeto del vector se podría escribir:
Vector items = new Vector();
// fill it
Object first = items.firstElement();
Hasta aquí todo bien.
Más tarde se decidió que debido a "alguna" razón, tiene que cambiar la aplicación (digamos que el vector crea un cuello de botella debido a la sincronización excesiva)
Se da cuenta de que necesita utilizar un instad ArrayList.
Bueno, el código se romperá ...
ArrayList items = new ArrayList();
// fill it
Object first = items.firstElement(); // compile time error.
No se puede. Esta línea y todas aquellas líneas que usan el método firstElement() se romperán.
Si necesita un comportamiento específico y definitivamente necesita este método, podría estar bien (aunque no podrá cambiar la implementación) Pero si lo que necesita es simplemente recuperar el primer elemento (que es , no hay nada de especial con el Vector que tenga el primer método de Element()) luego usar la interfaz en lugar de la implementación le daría la flexibilidad de cambiar.
List items = new Vector();
// fill it
Object first = items.get(0); //
De esta forma no se está codificando a la get method of Vector, sino a la get method of List.
No importa cómo hacer el objeto subyacente lleva a cabo el método, siempre que responde al contrato de "sacar el elemento 0 ª de la colección"
De esta manera es posible que después cambiarlo a cualquier otra aplicación :
List items = new ArrayList(); // Or LinkedList or any other who implements List
// fill it
Object first = items.get(0); // Doesn't break
Esta muestra puede parecer ingenuo, pero es la base sobre la que se basa la tecnología OO (incluso en aquellos idiomas que no son de tipos estáticos como Python, Ruby, Smalltalk, Objective-C, etc.)
Un ejemplo más complejo es t el camino JDBC funciona. Puede cambiar el controlador, pero la mayor parte de su llamada funcionará de la misma manera. Por ejemplo, puede usar el controlador estándar para las bases de datos de Oracle o puede usar uno más sofisticado como los que proporcionan Weblogic o Webpshere. Por supuesto que no es mágico todavía tiene que probar el producto antes, pero al menos usted no tiene cosas como:
statement.executeOracle9iSomething();
vs
statement.executeOracle11gSomething();
Algo similar sucede con Java Swing.
lectura adicional:
Design Principles from Design Patterns
Effective Java Item: Refer to objects by their interfaces
(La compra de este libro una de las mejores cosas que puede hacer en la vida - y leer si por supuesto -)
¡Guau! ¡Eso está muy bien explicado! –
¡Gracias! Me alegro de poder ayudar :) – weiji
Solo ten en cuenta que este principio se aplica a los tipos que creas, así como a las abstracciones integradas como Set. Por ejemplo, si tiene un "Foo" en su proyecto. No solo haga un "Foo de clase", en su lugar haga "interfaz Foo" y luego implemente algo como "clase MyFoo implementa Foo". Incluso podría encontrar que su proyecto tendrá varias clases que implementan la interfaz "Foo". Al escribir constantemente el nombre de la interfaz en lugar de la implementación (excepto las invocaciones de constructor), puede cambiar rápidamente las implementaciones de Foo para que se ajusten a sus necesidades. –