Шаблон проектирования адаптера используется для преобразования интерфейса класса (Target) в другой интерфейс (Adaptee), ожидаемый клиентами. Adapter позволяет несовместимым классам работать вместе, что иначе невозможно из-за их несовместимых интерфейсов.
Шаблон адаптера может быть реализован двумя способами: Наследование (версия класса шаблона адаптера) и Композиция (объектная версия шаблона адаптера).
Мой вопрос касается классовой версии шаблона адаптера, которая реализована с использованием Inheritance.
Вот пример редактора чертежей:
interface Shape
{
Rectangle BoundingBox();
Manipulator CreateManipulator();
}
class TextView
{
public TextView() { }
public Point GetOrigin() { }
public int GetWidth() { }
public int GetHeight() { }
}
interface Shape
{
Rectangle BoundingBox();
Manipulator CreateManipulator();
}
class TextView
{
public TextView() { }
public Point GetOrigin() { }
public int GetWidth() { }
public int GetHeight() { }
}
Мы хотели бы повторно использовать класс TextView для реализации TextShape, но интерфейсы отличаются, и поэтому объекты TextView и Shape нельзя использовать взаимозаменяемо.
Следует ли изменить класс TextView, чтобы он соответствовал интерфейсу формы? Возможно, нет.
TextShape может адаптировать интерфейс TextView к интерфейсу фигуры одним из двух способов:
- Унаследовав интерфейс Shape и реализацию TextView (классовая версия Adapter patter)
- Путем создания экземпляра TextView внутри объекта TextShape и реализации интерфейса TextShape с использованием экземпляра TextView (объектная версия шаблона Adapter).
Адаптер класса
interface Shape
{
Rectangle BoundingBox();
Manipulator CreateManipulator();
}
class TextView
{
public TextView() { }
public Point GetOrigin() { }
public int GetWidth() { }
public int GetHeight() { }
}
class TextShape : TextView, Shape
{
public Rectangle BoundingBox()
{
Rectangle rectangle;
int x, y;
Point p = GetOrigin();
x = GetWidth();
y = GetHeight();
//...
return rectangle;
}
#region Shape Members
public Rectangle Shape.BoundingBox()
{
return new TextBoundingBox();
}
public Manipulator Shape.CreateManipulator()
{
return new TextManipulator();
}
#endregion
}
Теперь к вопросу :-).
Является ли TextShape, наследуемое от Shape и, в частности, от TextView, допустимым отношением "is"? А если нет, то не нарушает ли принцип подстановки Лискова ?