explicación
Este modelo se utiliza para la adaptación, no se convertirá en la interfaz compatible interfaz compatible que permite la clase original y no a causa de las interfaces incompatibles para trabajar juntos para trabajar juntos
código fuente de la aplicación
Mango es el objeto puede estar presente en cualquiera de una manera diferente de la manipulación de diferentes interfaces de adaptación de la manija por HandleAdapter
Sobre la base de la herencia
// 类适配器:基于继承 pública interfaz iTarget { void f1 (); void f2 (); anular fc (); } Pública clase adaptée { público vacío fa () { // ...} pública vacío FB () { // ...} pública vacío FC () { // ...} } pública clase adaptador se extiende adaptée implementos iTarget { pública vacío f1 () { súper .fa (); } pública vacío F2 () { // ... reimplementar F2 () ... } // Aquí FC () no tiene por qué ser implementado directamente heredado de adaptée, que es el adaptador de objeto con la mayor diferencia }
Basado en una combinación de
// 对象适配器:基于组合 pública interfaz iTarget { void f1 (); void f2 (); anular fc (); } Pública clase adaptée { público vacío fa () { // ...} pública vacío FB () { // ...} pública vacío FC () { // ...} } pública clase adaptador implementa iTarget { privado adaptée adaptée; pública adaptador (adaptée adaptée) { este .adaptee =Adaptée; } pública vacío F1 () { adaptee.fa (); // confiada a la adaptée } pública vacío F2 () { // ... re-aplicar F2 () ... } pública vacío FC () { adaptee.fc (); } }
modo de adaptador de escenarios de aplicación
1. La interfaz externa en una interfaz interna compatible con la interfaz interna para que pueda
2. Compensación de defectos de diseño de la interfaz interna. Interfaz abstracta a un adaptador de interfaz más abstracta a través de un adaptador antes de la nueva interfaz
ejemplo
Diseño de Interfaces paquete defectuoso
SDK introduce interfaces externas. Al abstraer un mejor diseño de la interfaz
público de clase CD { // esta clase desde el SDK exterior, no tenemos el derecho de modificar su código // ... pública estática vacío staticFunction1 () { // ...} pública vacío uglyNamingFunction2) {( // ...} pública vacío tooManyParamsFunction3 ( int la PARAMA, int paramB, ...) { // ...} pública vacío lowPerformanceFunction4 () { // ...} } // adaptador de reconstrucción modo público de clase iTarget { nula function1 (); vacíofunction2 (); nula fucntion3 (ParamsWrapperDefinition paramsWrapper); nula FUNCTION4 (); // ... } // NOTA: nombre de la clase adaptador no tiene por qué terminar con adaptador pública clase CDAdaptor la extiende el CD de los implementos iTarget { // ... pública vacío function1 () { super .staticFunction1 (); } pública vacío function2 () { super .uglyNamingFucntion2 (); } pública vacío FUNCTION3 (ParamsWrapperDefinition paramsWrapper) { super.tooManyParamsFunction3 (paramsWrapper.getParamA (), ...); } Pública vacío FUNCTION4 () { // ... reimplementar que ... } }
Unificar múltiples clases de diseño de la interfaz
Tenemos una tecla de función de filtrado, una pluralidad de sistemas externos dependientes de clase, diferentes clases tiene su propia aplicación, hacemos abstracción a través del adaptador de interfaz interna
público de clase ASensitiveWordsFilter { // Un sistema de filtración proporciona una palabra sensible interfaz // texto el texto original, a continuación, las funciones de salida de texto con palabras sensibles sustitución *** pública Cadena filterSexyWords (cadena de texto) { // ... } pública filterPoliticalWords de Cuerda (texto String) { // ... } } pública clase BSensitiveWordsFilter { // B sensibles palabra de sistema de filtrado proporciona una interfaz pública filtro String (cadena de texto) { // ... } } pública clase CSensitiveWordsFilter { // C palabra sensible sistema de filtración proporciona una interfaz públicaFiltro String (cadena de texto, máscara String) { // ... } } // no utilizada anteriormente patrón de adaptadores de código: código de la capacidad de prueba, la mala escalabilidad pública clase de gestión del riesgo { Privado ASensitiveWordsFilter la AFILTER = nueva nueva ASensitiveWordsFilter (); privada BSensitiveWordsFilter bfilter = nueva nueva BSensitiveWordsFilter (); privada CSensitiveWordsFilter cFilter = nueva nueva CSensitiveWordsFilter (); público cadena filterSensitiveWords (cadena de texto) { cadena maskedText = aFilter.filterSexyWords (texto); maskedText =aFilter.filterPoliticalWords (maskedText); maskedText = bFilter.filter (maskedText); maskedText = cFilter.filter (maskedText, "***" ); retorno maskedText; } } // transformación modo de adaptador pública interfaz ISensitiveWordsFilter { // unificado interfaz de definición de filtro String (cadena de texto); } pública clase ASensitiveWordsFilterAdaptor los implementos ISensitiveWordsFilter { privado ASensitiveWordsFilter la AFILTER; pública filtro String (cadena de texto) { cadena maskedText =aFilter.filterSexyWords (texto); maskedText = aFilter.filterPoliticalWords (maskedText); retorno maskedText; } } // ... omitido BSensitiveWordsFilterAdaptor, CSensitiveWordsFilterAdaptor ... // mejor escalabilidad, más en línea con el principio de apertura y cierre, si se agrega un nuevo sensible sistema de filtrado de palabra, // esta clase completamente sin cambio; pero no para la programación basada en la interfaz, el código de una mejor capacidad de prueba. público de clase de gestión del riesgo { Privado List <> Filtros ISensitiveWordsFilter = new new ArrayList <> (); pública vacío addSensitiveWordsFilter (filtro ISensitiveWordsFilter) { filters.add (filtro); } públicaCadena filterSensitiveWords (cadena de texto) { Cadena maskedText = texto; para (ISensitiveWordsFilter filtro: filtros) { maskedText = filter.filter (maskedText); } Devolver maskedText; } }