Благодаря «Анализ образцов дизайна исходного кода Android и практической практики» он заботился о людях.
Режим адаптера чрезвычайно полезен в нашей разработке. Это можно судить по адаптерам, которые можно увидеть повсюду в коде. Из самого раннего ListView, Gridview и последней переработки нам всем необходимо использовать адаптеры, а проблемы оптимизации и места с высокой вероятностью ошибок, с которыми мы сталкиваемся в разработке, в основном получены из адаптеров.
Адаптеры должны вместе объединить двух несовместимых пожарных драконов и использовать преобразование, чтобы они могли сотрудничать. Например, часто встречается, что вы хотите взаимодействовать между двумя неродственными типами. Первое решение состоит в том, чтобы изменить интерфейсы каждого класса. Однако, если нет исходного кода или мы не хотим изменять их соответствующие интерфейсы для приложения, в данном случае мы часто используем адаптер, который будет совместимы с этими двумя интерфейсами и удовлетворяет потребности без изменения исходного кода.
Предположим, уже существует программная система, и вы хотите, чтобы она использовалась с новой библиотекой классов производителя, но интерфейс, разработанный этим новым производителем, не используется для интерфейса старого производителя:
Что вы должны делать, если вы не хотите менять существующий код и решить эту проблему (и вы не можете изменить код производителя)? Вы можете написать класс (адаптер), который преобразует новый интерфейс поставщика в ожидаемый интерфейс. Этот адаптер работает как посредник, который преобразует запросы, выданные клиентом в запросы, которые может понять класс поставщиков.
Режимы адаптера можно разделить на два типа:
Адаптер объекта: Полн хороших принципов дизайна. Используя комбинации объектов, его можно применить к адаптеру в качестве интерфейса и ко всем его подклассам. Метод адаптера не может быть переписывается, потому что нет никаких отношений наследования, но он также может «повторно» метод в адаптере. Клиент и адаптер совершенно не имеют значения, и только адаптер имеет ссылки на адаптер.
Адаптер класса: Используйте наследование для достижения работы адаптера. Только адаптер является интерфейсом и не может использовать его интерфейс подкласса. Когда адаптер класса установлен, он статически связан с адаптером. Адаптер служит базовым классом адаптера, поэтому адаптер может переписать методы в адаптере. Клиентский код виден коду, объявленному в адаптере. Клиентский код виден коду, объявленному в адаптере.
определение:
Паттерн адаптера превращает интерфейс одного класса в другой интерфейс, который ожидает клиент, так что два класса, которые изначально не могли работать вместе из -за несоответствия интерфейса, могут работать вместе.
Используйте сценарии:
1. Система должна использовать существующие классы, и такие интерфейсы не отвечают потребностям системы, то есть интерфейсы несовместимы.
2. Хотите создать класс, который можно использовать для работы с некоторыми классами, которые не очень связаны друг с другом, включая некоторые классы, которые могут быть представлены в будущем.
3. Требуется единый выходной интерфейс, и тип входного конца непредсказуем.
Диаграмма класса UML:
Сначала посмотрите на следующие адаптеры:
Класс Адаптеры реализуют преобразование интерфейса, реализуя целевой интерфейс и унаследовав класс адаптации. Например, целевой интерфейс требует операции2, но объект адаптации имеет только одну операцию3, поэтому существуют несовместимые ситуации. В настоящее время функция Operation2 реализуется через адаптер для преобразования операции Adaptee3 в операцию2, требуемое Target, чтобы достичь совместимости.
Цель: целевая роль, то есть интерфейс, который вы ищете. Примечание. Поскольку здесь обсуждается шаблон адаптера класса, цель не может быть классом.
Адаптируется: теперь требуется адаптированный интерфейс.
Адаптер: Роль адаптера также является ядром этого режима. Адаптер преобразует интерфейс исходного интерфейса в целевой интерфейс. Эта роль не может быть интерфейсом, но должен быть конкретным классом.
Пример режима адаптера класса:
Возьмите напряжение на материке составляет 220 В, а напряжение мобильного телефона составляет 5 В, в качестве примера
/** * Целевая цель класса напряжения * @author Administrator * */Public Interface напряжение {public int getVoltage ();} открытый класс Chinavoltage реализует напряжение {@Override public int getVoltage () {// Континентальное напряжение 220 return 220; }} <pre name = "code">/** * класс мобильного телефона, адаптер адаптер * @author Administrator * */public Class PhoneVoltage {/** * Напряжение мобильного телефона - 5 В * @return */public int getPhoneVoltage () {return 5; }} <pre name = "code">/** * Администратор адаптера зарядного устройства * */Общедоступное зарядное устройство Extends PhoneVoltage реализует напряжение {@Override public int getVoltage () {return getPhoneVoltage (); }} public Class Client {public static void main (string [] args) {chinavoltage vol = new Chinavoltage (); System.out.println («Напряжение материкового напряжения:» + vol.getvoltage ()); // Напряжение при подключении зарядного устройства к Mobile Phone Chargerr Mearry = new Chargrr (); System.out.println («Напряжение, преобразованное через зарядное устройство:« + parment.getvoltage ()); }} Результаты работы:
Напряжение в материковом Китае: 220
Напряжение преобразовано через зарядное устройство: 5
Давайте посмотрим на диаграмму класса адаптера объекта:
Следующее предназначено для изменения класса chargerr, используя адаптер объекта
<pre name = "code">/** * Администратор адаптера зарядного устройства * * */Общедоступный класс chargrr реализует напряжение {private phonevoltage phonev; public chargerr (phonevoltage phonev) {this.phonev = phonev; } @Override public int getVoltage () {return PhoneV.getPhoneVoltage (); }}Метод реализации адаптера объекта непосредственно передает объект, который будет адаптирован к адаптеру, и использует комбинированную форму для достижения эффекта совместимости интерфейса. Это более гибко, чем метод адаптера класса. Другое преимущество заключается в том, что методы в адаптированном объекте не будут выставлены. Поскольку адаптер класса наследует адаптированный объект, функции адаптированного класса объекта также содержатся в классе адаптера, что делает класс адаптера, которые имеют некоторые странные интерфейсы, что более экономически эффективно для пользователей. Следовательно, режим адаптера объекта является более гибким и практичным.
Public Class Client {public static void main (string [] args) {// chinavoltage vol = new Chinavoltage (); // system.out.println («Напряжение материкового возраста:» + vol.getvoltage ()); // // напряжение при подключении телефона к Chargerr Cargerr) преобразовано через зарядное устройство: " + agance.getvoltage ()); // адаптированный телефон PhoneVoltage PhoneV = new PhoneVoltage (); Chargerr charger = new Chargerr (PhoneV); System.out.println («напряжение, преобразованное через зарядное устройство:« + charger.getvoltage ()); } // Результат работы: // напряжение, преобразованное через зарядное устройство: 5} Суммировать:
Классическая реализация модели адаптера заключается в интеграции первоначально несовместимых интерфейсов, чтобы они могли хорошо сотрудничать. Однако в реальной разработке модель адаптера также имеет некоторые гибкие реализации. Например, изменения изоляции в ListView делают всю архитектуру пользовательского интерфейса более гибкой и могут принять изменения. Модель адаптера широко используется в разработке.
преимущество:
Лучшая способность повторного использования: система должна использовать существующие классы, и такие интерфейсы не отвечают потребностям системы. Тогда эти функции могут быть лучше повторно использованы через режим адаптера.
Лучшая масштабируемость: при реализации функции адаптера вы можете вызвать функции, которые вы разработали сами, чтобы естественным образом расширить функции системы.
недостаток:
Слишком много использования адаптеров сделает систему очень грязной и трудной для понимания. Например, chang in interface, который называется, фактически адаптирован к реализации интерфейса B. Если в системе слишком много случаев, это равносильно катастрофе. Следовательно, если это не необходимо, адаптер может быть использован вместо того, чтобы рефакторировать систему напрямую.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.