Читайте также:
|
|
Предоставляет метод, который позволяет подклассам перекрывать части метода, не прибегая к переписыванию.
Общая логика выноситься в абстрактный класс, в то время как те места, которые могут (или должны) подвергаться изменениям в наследуемых классах выделяются в абстрактные методы, которые реализуются в наследниках. При этом эти абстрактные методы объявляются protected, чтобы избежать их прямого вызова извне. Такой подход позволяет избежать перекрытия большого куска логики (в противном случае пришлось бы перекрывать целыд метод templateMethod(), даже если изменения касаются всего нескольких строк), что ведёт к дублированию общих её частей в классах-потомках.
Visitor
Обеспечивает простой и удобный способ выполнения неких операций для определённого семейства классов. Это достигается путём централизации с помощью данного шаблона возможных вариантов поведения, что позволяет модифицироваь или расширять их, не затрагивая классы, на которые распространяются эти варианты поведения.
Этот шаблон может использоваться например в следующей ситуации. Допустим ConcreteElementA и ConcreteElementB представлены классами типа Circle и Square. Необходимо вычислять их площать. При этом есть потребность вынести операцию вычисления площади за пределы класса. (Например, при наличии нескольких операций которые можно добавлять или удалять динамически.) Оба класса экспортируют свойства, первый – радиус, сторой – размер стороны. Пусть за операцию вычисления площади отвечает ConcreteVisitorA, тогда его код быть иметь вид:
public class AreaVisitor implements Visitor{
private float totalArea = 0;
public void visit(Element element){
if(element instanceof Square){
Square square = (Square)element;
totalArea += square.side()*square.side();
}else if(element instanceof Circle){
Circle circle = (Circle)element;
totalArea += 3.14 * circle.radius()*circle.raduis();
}else{
System.out.println(“Unknown Element, ignoring it”);
}
}
}
При этом видно, что класс AreaVisitor зависит от классов с которыми он может работать (так как напрямую приводит к их типу). Вообще говоря приведение интерфейса к типу является нежелательным подходом при проектировании, однако, такой трибуты позволяет выделить и добавлять операции к элементам не меняя их кода. Например, не меняя кода можно добавить операцию отрисовки на экране заданной коллекции элементов. Если состав типов элементов фиксирован (например, нам известно, что в нашей модели могут быть только Circle и Square), то можно использовать перегрузку методов, вместо явного приведения и неудобных операций if(...){...}else.
Дата добавления: 2015-10-24; просмотров: 109 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Abstract Factory | | | Структурные шаблоны |