Главная страница

Рабочая программа по дисциплине Цели и задачи освоения дисциплины Дисциплина Объектноориентированный анализ и программирование


Скачать 339.98 Kb.
НазваниеРабочая программа по дисциплине Цели и задачи освоения дисциплины Дисциплина Объектноориентированный анализ и программирование
Дата12.10.2022
Размер339.98 Kb.
Формат файлаdocx
Имя файлаobektno-orientirovannyj_analiz_i_programmirovanie_161021.docx
ТипРабочая программа
#730141
страница12 из 14
1   ...   6   7   8   9   10   11   12   13   14
return false;

return true;

public class DescendingSort extends Sort {

public boolean compare(int x, int y) { if(x <= y)

return true;

return false;

public class Client {

private static void print(int.. arg) { for(int i = 0; i < arg.length; i-+)

System.out.print(arg.i. + " ");

System.out.printin();

System.out.flush();

public static void main(String I. args) { int[] a = {2, 5, 4, 1, 3);

int.. b = a.clone ();

Sort sorterForA new AscendingSort();

Sort sorterForB new DescendingSort();

a = sorterForA.sort(a);

b = sorterForB.sort(b);

print(a);

print(b);

В данном примере абстрактный класс Sort определяет предназначенный для упорядочивания массива целых чисел метод sort(). Для обмена элементов массива местами используется приватный метод swap(). Сравнение элементов выполняется с помощью абстрактного метода compare. Потомки класса Sorter — AscendingSort и DescendingSort — как раз и реализуют compareQ. От конкретной реализации метода зависит конечный итог сортировки. Первый потомок упорядочивается массив но возрастания, второй — но убыванию.

Состояние

Отчасти близким к шаблонному методу является «состояние» — поведенческий шаблон проектирования, позволяющий объекту варьировать свое поведение в зависимости от внутреннего состояния. Этот шаблон способен заменить собой код с большим количеством условных операторов, в котором выбор ветви зависит от членов объекта. При этом чаще всего механизмы изменения внутреннего состояния выносятся в отдельный класс. Такой подход позволяет изолировать логику работы от реализации.

Пример реализация «состояния» представлен ниже.

public interface State {

public void shift(int .. data);

public class ShiftLeft implements State {

public void shift(int.. data) {

if(data 1= null) {

int tmp = data[0];

for(int i = 0; i < data.length - 1; i++)

data.i = data.i + 11;

data.data._ength - 1] = tmp;

}

}

}

public class ShiftRight implements State {

public void shift(int[I data) { if(data != null) {

int tmp data data.length - 1] ;

forfint i - data._ength - 1; i > 0; i--)
data . i. = data.i
- 1 ] ;


data.O; = tmp;

}

}

}

public class Context {

private int.. data;

private int state;

private State shifter;

public Context(int[I data) { this.data = data.clone(); state = 0;

shifter new ShiftLeftO;

}

public void shift() {

shifter.shift(data);

}

public void changestate() { if(state == 0)

shifter new ShiftRight() ;

else

shifter new ShiftLeftO;

state = 1 - state;

public void print() {

for(int i = 0; i < data._ength; i++) System.out.print(data.i. + " ");

System.out.printin();

Интерфейс State декларирует метод shift)), осуществляющий циклический сдвиг элементов массива. Классы ShiftRighl и ShiftLcft реализуют интерфейс State и позволяют выполнять сдвиг вправо и влево соответсвенно. Экземпляр класса Context содержит влияющий на поведение член state: если состояние тождественно равно О, то при вызове метода shift() нроизодйет сдвиг хранимых данных влево, иначе — вправо. За изменение состояния объекта отвечает метод changeStateQ.

Посредник

Сложные системы содержат огромное число классов. Для того, чтобы система функционировала, классы должны взаимодействовать друг с другом. Часто такая необходимость приводит к тому, что вся система «обрастает» огромным числом ссылок. Поведение такой системы в дальнейшем очень сложно модифицировать. Более того, такой код не может быть повторно использован. Для решения описанной проблемы предназначен шаблон «посредник», который позволяет организовывать взаимодействие других классов «через себя». Иными словами, «посредник» — поведенческий шаблон проектирования, предназначенный для обеспечения слабой связности системы (избавление объектов от необходимости ссылаться друг на друга).

Использование «посредника» обеспечивает ряд преимуществ. Во-первых, устраняется связность между подклассами системы. Во-вторых, упрощаются протоколы взаимодействия между компонентами. И наконец, в-третьих, «посредника» позволяет централизовать управление.

Примером использования «посредника» является следующий код.

import java.util.Vector;

public class Array {

private Vector data;

private Mediator m;

Array(Mediator m) { this. it. = m;

data new Vector();

public void add(int argO) { data.add(argO);

m.update(argO);

}

public class Maximal { private int maximum = -1; private Mediator m;

Maximal(Mediator m) { this.m = m; rn.setMaxim.a_ (this) ;

}

public void setMaximum(int argO) {

if(maximum < argO) { maximum = argO;

m.printUpdate(argO);

public class Printer {

Printer(Mediator m) {

m.setPrinter(this); }

public void printAdd(int argO) {

System.out.printin("Add number " + argO);

public void printMaximum(int argO) {

System.out.printin("Maximum now is " - argO);

public class Mediator {

private Maximal m;

private Printer p;

public void update(int argO) {

if(p != null)

p.printAdd(argO);

if(m != null)

m.setMax imum(argO);

public void printUpdate(int argO) { if(p != null)

p.printMaximum(argO);

public void setPrinter(Printer p) { this.p = p;

public void setMaximal(Maximal m) { this.m = m;

}

В представленном примере система включает в себя три класса: Array, Maximal и Printer. Первый класс осуществляет хранение массива данных и реализует функции доступа к нему. Второй класс предоставляет методы для взаимодействия и обработки данных (в данном случае — определение и хранение максимального элемента). Третий класс необходим для локирования изменений. Взаимодействие между блоками системы реализуется с помощью класса-посредника Mediator, который является членом Array и Maximal. Такое решение гарантируется слабую связность между компонентами. Ни одному элементу системы неизвестно ничего про остальные. Всю работу по связыванию выполняет Mediator.

Команда

Последним рассматриваемым в данном разделе шаблоном будет «команда» — поведенческий шаблон проектирования, предназначенный для обработки запросов как объектов. Он позволяет парамсгризировать объекты выполняемым действием, ставить запросы в очередь, отменять запросы, протоколировать проделанные изменения и так далее. Иными словами «команда» — своеобразная объектная обертка для пользовательских запросов. С его помощью может быть создана структурированная на основе высокоуровневых операций легко изменяемая система.

Ниже представлен пример реализации данного шаблона.

public interface Command {

public void execute(int x, int y) ;

public class FlipUp implements Command { private Grid grid;

FiipUp(Grid grid) { this.grid = grid;

}

public void execute(int x, int y) { grid.flipUp(x, y) ;

public class FlipDown implements Command private Grid grid;

FlipDown(Grid grid) { this.grid = grid;

public void execute(int x, int y) { grid.flipDown(x, y);

}

public class Invoker {

public Command cFlipUp;

public Command cFlipDown;

Invoker(Command flipUp, Command flipDown) { this.cFlipUp = flipUp; this.eFlipDown = flipDown;

public void flipUp(int x, int y) { this.cF_ipUp.execute(x, y);

}

public void flipDown(int x, int y) { this.cF.ipDown.execute(x, y);

}

}

public class Grid {

private bytefI[, data;

private static int[] dx = {-1, 0, 1, 0};

private static int.. dy = {0, 1, 0, -1} ;

Grid() {

data = new byte[4][4];

public void flipUp(int x, int y) {

if(x > -1 && x < 4 && у > -1 && у < 4) { data.x..у. = 1;

for(int i = 0; i < 4; i++)

flip(x + dx.i], у + dy.i]);

}

}

public void flipDown(int x, int y) {

if (x > -1 && x < 4 && у > -1 && у < 4) { data ,x. .у. = 0;

for(int i = 0; i < 4; i++)

flip(x + dx.i., у + dy.i.);

}

1   ...   6   7   8   9   10   11   12   13   14


написать администратору сайта