Задание
В качестве основы использовать исходный текст проекта предыдущей работы (см. здесь). Используя шаблон проектирования Factory Method (Virtual Constructor), расширить иерархию производными классами, реализующими методы для представления результатов в виде текстовой таблицы. Параметры отображения таблицы должны определяться пользователем.
Продемонстрировать замещение (переопределение, overriding), совмещение (перегрузка, overloading), динамическое назначение методов (позднее связывание, полиморфизм, dynamic method dispatch).
Обеспечить диалоговый интерфейс с пользователем.
Разработать класс для тестирования основной функциональности.
Использовать комментарии для автоматической генерации документации средствами javadoc.
Разработка программы
Реализуем классы, структура которых соответствует схеме в пункте иерархия.
Разработаем класс MainTest для проведения теста основной функциональности кода. Реализуем методы:
testCalc() – для проверки основной функциональности класса ViewTable.
testRestore() – для проверки корректности восстановления данных при сериализации.
В процессе разработки необходимо обеспечить прохождение всех тестов.
Используемые средства ООП
Метод называют абстрактным, если он имеет только объявление и не имеет реализации. Класс, содержащий абстрактные методы, называется абстрактным классом. Если класс содержит один или больше абстрактных методов, этот класс должен быть определен как abstract.
Все методы дочерних классов, совпадающие с объявлением сигнатуры в базовом, выполняют переопределение (замещение, overriding) и используют динамическое связывание. Если имя метода совпадает с именем метода базового класса, а аргументы различны, то это означает перегрузку (совмещение, overloading).
Полиморфизм позволяет повысить возможности по организации кода и читабельность исходных текстов, облегчить создание расширяемых программ, предполагающих дальнейшее наращивание функциональности.
Иерархия и структура классов
Структура классов и схема их отношений:
Описание программы
При разработке классов используем наследование и композицию. При вызове методов объектов используется позднее связывание.
Текст програми
ViewTable.java
package ex03;
import java.util.Formatter;
import ex02.Item1;
import ex02.ViewResult;
/** ConcreteCreator
* шаблон проектирования
* Factory Method
* Вывод в виде таблицы
* @author Александр
*@version 1.0
*@see ViewResult
*/
public class ViewTable extends ViewResult{
/** Определяем ширину таблицы по умолчанию */
private static final int DEFAULT_WIGTH = 15;
/** Текущая ширина таблицы */
private int width;
private int a;
private int b;
private int p;
public ViewTable() {
width = DEFAULT_WIGTH;
}
public ViewTable(int wigth){
this.width = wigth;
}
public ViewTable(int width, int n){
super(n);
this.width = width;
}
public int setWidth( int width){
return this.width = width;
}
public int seta( int a){
return this.a = a;
}
public int setb( int b){
return this.b = b;
}
public int setp( int p){
return this.p = p;
}
public int getWidth(){
return width;
}
public int geta(){
return a;
}
public int getb(){
return b;
}
public int getp(){
return p;
}
private void outLine(){
for(int i = width; i>0 ; i--){
System.out.print('-');
}
System.out.print('\n');
}
private void outLineLn(){
outLine();
System.out.println();
}
private void outHeader(){
Formatter fmt = new Formatter();
fmt.format("%s%d%s%2$d%s%s","%",(width-4)/2,"s | %", "s | ","s\n");
System.out.printf(fmt.toString(),"x ","y ","p ");
setWidth(50);
outLine();
}
private void outBody(){
Formatter fmt = new Formatter();
System.out.println(geta() + " " + getb() + " " + getp());
setWidth(50);
outLine();
Item1 item = new Item1();
// System.out.printf(item.getP());
}
/** Перегрузка метода суперкласса;
* устанавливает поле {@linkplain ViewTable#width} значением <b>width</b><br>
* Для объекта {@linkplain ViewTable} вызывает метод {@linkplain ViewTable#init(double stepX)}
* @param width новая ширина таблицы.
* @param stepX передается методу <b>init(int)</b>
*/
public final void init(int width, int stepX, int stepX2) { // method overloading
this.width = width;
init(stepX, stepX2);
}
/** Переопределение (замещение, overriding) метода суперкласса;
* выводит информационное сообщение и вызывает метод суперкласса
* {@linkplain ViewResult#init(int stepX) init(int stepX)}<br>
* {@inheritDoc}
*/
public double init(int stepX, int stepX2) { // method overriding
super.init(stepX);
seta(stepX);
setb(stepX2);
stepX = 2*(stepX + stepX2);
setp(stepX);
return stepX;
}
/** Вывод элемента таблицы<br>{@inheritDoc} */
@Override
public void viewHeader() {
outHeader();
outLineLn();
}
/** Вывод элемента таблицы<br>{@inheritDoc} */
@Override
public void viewBody() {
outBody();
}
/** Вывод элемента таблицы<br>{@inheritDoc} */
@Override
public void viewFooter() {
outLineLn();
}
}
Main.java
package ex03;
import ex02.View;
import ex03.ViewTable;
/**Вычисление и отобрежение результатов
* Содержит реализацию статического метода main()
* @author Александр
* @version 3.0
* @see Main#main
*/
public class Main extends ex02.Main {
/** Инициализирует поле {@linkplain LAB02.Main#view view} */
public Main(View view) {
super(view);
}
/** Выполняется при запуске программы;
* вызывает метод {@linkplain LAB02.Main#menu menu()}
* @param args - параметры запуска программы
*/
public static void main(String[] args) {
Main main = new Main(new ViewableTable().getView());
//main.menu();
ViewTable i = new ViewTable();
i.init(1, 2);
i.viewHeader();
i.viewBody();
i.init(2, 3);
i.viewBody();
i.init(4, 5);
i.viewBody();
}
}
ViewableTable.java
package ex03;
import ex02.ViewableResult;
import ex02.View;
/** ConcreteCreator
* шаблон проектирования
* Factory Method
* Объявляет метод
* "фабрикующий" объекты
* @author Александр
*@version 1.0
*@see ViewableResult
*@see ViewableTable#getView()
*/
public class ViewableTable extends ViewableResult {
/** Создаёт отображаемый объект {@linkplain ViewTable} */
@Override
public View getView() {
return new ViewTable();
}
}
MainTest.java
package ex03;
import ex03.Main;
import java.io.IOException;
import junit.framework.TestCase;
/**Выполняет тестирование разработанного класса CalcT
* @author Александр
*/
public class MainTest extends TestCase {
/**проверка основной функциональности класса*/
public void testCalcT(){
ViewTable calcP = new ViewTable();
calcP.init(1, 1);
assertEquals(4, calcP.getp(), .1e-1);
calcP.init(2, 2);
assertEquals(8, calcP.getp(), .1e-1);
calcP.init(3, 3);
assertEquals(12, calcP.getp(), .1e-1);
calcP.init(4, 4);
assertEquals(16, calcP.getp(), .1e-1);
calcP.init(5, 5);
assertEquals(20, calcP.getp(), .1e-1);
}
}
Результат тестирования: