Задание
В качестве основы использовать исходный текст проекта предыдущей работы (см. здесь). Обеспечить размещение результатов вычислений в коллекции с возможностью сохранения/восстановления.
Используя шаблон проектирования Factory Method (Virtual Constructor), разработать иерархию, предусматривающую расширение за счёт добавления новых отображаемых классов.
Расширить иерархию интерфейсом "фабрикуемых" объектов, представляющим набор методов для отображения результатов вычислений. Реализовать эти методы для вывода результатов в текстовом виде. Разработать и реализовать интерфейс для "фабрикующего" метода.
Обеспечить диалоговый интерфейс с пользователем.
Разработать класс для тестирования основной функциональности.
Использовать комментарии для автоматической генерации документации средствами javadoc.
2 Пример проекта
2.1 Разработка программы
Реализуем классы, структура которых соответствует схеме п.2.3. Разработаем тест, проверяющий основную функциональность кода. Реализуем методы:
testCalc() – для проверки основной функциональности класса ViewResult.
testRestore() – для проверки корректности восстановления данных при сериализации.
В процессе разработки необходимо обеспечить прохождение всех тестов.
2.2 Используемые средства ООП
При разработке классов используем наследование и композицию.
Интерфейс в java.
Шаблон проектирования Factory Method (также известный как Virtual Constructor), который проводит, определяет стандартный метод создания объекта, не связанный с вызовом конструктора, оставляя решение о том. какой именно объект создавать, по подклассам. Он "фабрикует" объекты,когда в них возникает необходимость.
2.3 Иерархия и структура классов
2.4 Описание программы
Разработаем интерфейсы View и Viewable для представления методов отображения (вывода) классов и создания отображаемого объекта. Реализуем эти интерфейсы в классах ViewResult и ViewableResult соответственно. При написании исходного кода используем стиль комментариев документации javadoc.
Выполним генерацию документации:
3. Текст програми
3.1 Класс View.java
package ex02;
import java.io.IOException;
/**Product
* (шаблон проектирования
* Factory Method)<br>
* Интерфейс "фабрикуемых"
* @author Александр
* Объявляем методы
*отображения объектов
*/
public interface View {
/**Отображает заголовок */
public void viewHeader();
/**Отображает основную часть */
public void viewBody();
/**Отображает окончание*/
public void viewFooter();
/**Отображает объект целиком*/
public void viewShow();
/**Отображает периметр*/
public void viewP(int i);
/**Отображает периметр*/
public void viewPB(int i);
/**Выполняет инициализацию*/
public void viewInit(int i);
/**Сохраняет данные для последующего восстановления*/
public void viewSave() throws IOException;
/**Востанавливает ранее сохраненные данные*/
public void viewRestore() throws Exception;
}
3.2 Класс ViewResult.java
package ex02;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import ex02.Item1;
/**ConctereProduct
* (шаблон проектирования
* Factory Method)<br>
* Вычисление функции
* @author Александр
* сохранение и отображение
*результатов
*@see View
*/
public class ViewResult implements View{
/**Имя файла, используемого при сериализации*/
private static final String FNAME = "items.bin";
private static Item1 item = new Item1();
private static Item2 item2 = new Item2();
private static CalcT it = new CalcT();
/**Определяет количество значений для вычисления по умолчанию*/
private static final int DEFAULT_NUM = 10;
public ViewResult(int defaultNum) {
// TODO Auto-generated constructor stub
}
/**Вызывает {@linkplain ViewResult#ViewResult(int) ViewResult(int n)}}
* с параметром {@linkplain ViewResult#DEFAULT_NUM DEFAULT_NUM}}
*/
public ViewResult(){
this (DEFAULT_NUM);
}
/**Инициализация*/
public double init (int st){
double x = 1;
double y = 1;
double s = 0;
double stepX;
stepX = item.getX() + (double)st;
item.setXY(x, y);
if (stepX == 1 ){
s = (y + Math.hypot(x/2, y) + Math.hypot(x/2, y));
}else s = (y+x)*2;
return s;
}
/**Иницализация*/
public void viewInit(int i){
if (i == 1 ) item.setP(init(i));
else item2.setP(init(i));
}
/**Вывод период*/
public void viewP(int i){
if (i == 1) System.out.println("Perimetr = " + item.getP());
else System.out.println("Perimetr = " + item2.getP());
}
/**Вывод количество единиц для твоичной системе*/
public void viewPB(int j){
System.out.print("Perimetr imeet ");
int b = 1;
int i = 0;
int p;
if (j == 1 )p = (int)item.getP();
else p = (int)item2.getP();
while (p > 1 ){
b = b*2;
if (p - 2*b < 0){
p = p - b;
b = 1;
i++;
}
}
if (p == 1 ) i++;
System.out.print(i);
System.out.println(" edinits");
}
/**Сохранение текущего*/
public void viewSave() throws IOException{
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(FNAME));
os.writeObject(item);
os.flush();
os.close();
}
/**восстановление последнего*/
public void viewRestore() throws Exception {
ObjectInputStream is = new ObjectInputStream(new FileInputStream(FNAME));
item = (Item1)is.readObject();
is.close();
}
public void viewHeader() {
System.out.println("Result: ");
}
public void viewBody(){
System.out.printf("(%.0f; %.3f)",item.getX(), item.getP());
System.out.println("End ");
}
public void viewShow(){
viewHeader();
viewBody();
viewFooter();
}
/**Реализация метода */
public void viewFooter() {
System.out.println("End ");
}
}
3.3 Класс ViewableResult.java
package ex02;
public class ViewableResult {
public View getView(){
return new ViewResult();
}
}
3.4 Класс Main.java
package ex02;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/**Вычисление и отобрежение результатов
* Содержит реализацию статического метода main()
* @author Александр
* @version 2.0
* @see Main@main
*/
public class Main {
/**Объект, реализующий интерфейс {@linkplain View}};
* обслуживает колеекцию объектов {@linkplain ex02.Item2}}
*/
private View view;
/**Инициализирует поле {@linkplain Main#view view}} */
public Main(View view){
this.view = view;
}
/**Отображает меню */
private void menu() {
String s = null;
BufferedReader in = new BufferedReader(new InputStreamReader(System.in ));
do{
do{
System.out.println("Enter Command: ");
System.out.println("1 - Vvod Treugolnik");
System.out.println("2 - Vvod Pryamougolnik");
System.out.println("3 - Vivod perimetra Treugolnika");
System.out.println("4 - Vivod perimetra Pryamougolnika");
System.out.println("5 - Vivod perimetra Treugolnika BIN");
System.out.println("6 - Vivod perimetra Pryamougolnika BIN");
System.out.println("7 - Save");
System.out.println("8 - Restore");
System.out.println("9 - Exit");
try{
s = in.readLine();
} catch(IOException e){
System.out.println("Error: " + e);
System.exit(0);
}
}while (s.length() != 1);
switch (s.charAt(0)) {
case '1':
System.out.println("Vvod ocnovaiya i visotu: ");
view.viewInit(1);
break;
case '2':
System.out.println("Vvod dvuh storon pryamougolnika: ");
view.viewInit(2);
break;
case '3':
System.out.println("Perimetr treugolnika = ");
view.viewP(1);
break;
case '4':
System.out.println("Perimetr pryamougolnika = ");
view.viewP(2);
break;
case '5':
System.out.println("Treugolnik ");
view.viewPB(1);
break;
case '6':
System.out.println("Pryamougolnika ");
view.viewPB(2);
break;
case '7':
System.out.println("Save current ");
try{
view.viewSave();
}catch(IOException e){
System.out.println("Treugolnik: Serialozation ERROE: " + e);
}
view.viewShow();
try{
view.viewSave();
}catch(IOException e){
System.out.println("Pryamougolnik: Serialozation ERROE: " + e);
}
break;
case '8':
System.out.println("Restore last saved ");
try{
view.viewRestore();
}catch(Exception e){
System.out.println("Treugolnik: Serialozation ERROE: " + e);
}
view.viewShow();
try{
view.viewShow();
}catch(Exception e){
System.out.println("Pryamougolnik: Serialozation ERROE: " + e);
}
break;
case '9':
System.out.println("Exit.");
break;
default:System.out.print("Wround command:) ");
}
}while(s.charAt(0) != '9');
}
/**Выполняется при запуске программы */
public static void main(String[] srgs){
Main main = new Main(new ViewableResult().getView());
main.menu();
}
}
3.5 Класс MainTest.java
package ex02;
import ex02.CalcT;
import java.io.IOException;
import junit.framework.TestCase;
/**Выполняет тестирование разработанного класса CalcT
* @author Александр
*/
public class MainTest extends TestCase {
/**проверка основной функциональности класса*/
public void testCalcT(){
CalcT calcT = new CalcT();
calcT.init(1, 1);
assertEquals(3.23606797749979, calcT.getResult().getP(), .1e-5);
calcT.init(2, 2);
assertEquals(6.47213595499958, calcT.getResult().getP(), .1e-5);
calcT.init(3, 3);
assertEquals(9.70820393249937, calcT.getResult().getP(), .1e-5);
calcT.init(4, 4);
assertEquals(12.94427190999916, calcT.getResult().getP(), .1e-5);
calcT.init(5, 5);
assertEquals(16.18033988749895, calcT.getResult().getP(), .1e-5);
}
}
4. Результат работы программы
Enter Command:
1 - Vvod Treugolnik
2 - Vvod Pryamougolnik
3 - Vivod perimetra Treugolnika
4 - Vivod perimetra Pryamougolnika
5 - Vivod perimetra Treugolnika BIN
6 - Vivod perimetra Pryamougolnika BIN
7 - Save
8 - Restore
9 - Exit
1
Vvod ocnovaiya i visotu:
Enter Command:
1 - Vvod Treugolnik
2 - Vvod Pryamougolnik
3 - Vivod perimetra Treugolnika
4 - Vivod perimetra Pryamougolnika
5 - Vivod perimetra Treugolnika BIN
6 - Vivod perimetra Pryamougolnika BIN
7 - Save
8 - Restore
9 - Exit
3
Perimetr treugolnika =
Perimetr = 3.23606797749979
Enter Command:
1 - Vvod Treugolnik
2 - Vvod Pryamougolnik
3 - Vivod perimetra Treugolnika
4 - Vivod perimetra Pryamougolnika
5 - Vivod perimetra Treugolnika BIN
6 - Vivod perimetra Pryamougolnika BIN
7 - Save
8 - Restore
9 - Exit
7
Save current
Result:
(1; 3,236)End
End
Enter Command:
1 - Vvod Treugolnik
2 - Vvod Pryamougolnik
3 - Vivod perimetra Treugolnika
4 - Vivod perimetra Pryamougolnika
5 - Vivod perimetra Treugolnika BIN
6 - Vivod perimetra Pryamougolnika BIN
7 - Save
8 - Restore
9 - Exit
1
Vvod ocnovaiya i visotu:
Enter Command:
1 - Vvod Treugolnik
2 - Vvod Pryamougolnik
3 - Vivod perimetra Treugolnika
4 - Vivod perimetra Pryamougolnika
5 - Vivod perimetra Treugolnika BIN
6 - Vivod perimetra Pryamougolnika BIN
7 - Save
8 - Restore
9 - Exit
3
Perimetr treugolnika =
Perimetr = 4.0
Enter Command:
1 - Vvod Treugolnik
2 - Vvod Pryamougolnik
3 - Vivod perimetra Treugolnika
4 - Vivod perimetra Pryamougolnika
5 - Vivod perimetra Treugolnika BIN
6 - Vivod perimetra Pryamougolnika BIN
7 - Save
8 - Restore
9 - Exit
8
Restore last saved
Result:
(1; 3,236)End
End
Result:
(1; 3,236)End
End
Enter Command:
1 - Vvod Treugolnik
2 - Vvod Pryamougolnik
3 - Vivod perimetra Treugolnika
4 - Vivod perimetra Pryamougolnika
5 - Vivod perimetra Treugolnika BIN
6 - Vivod perimetra Pryamougolnika BIN
7 - Save
8 - Restore
9 - Exit
3
Perimetr treugolnika =
Perimetr = 3.23606797749979
Enter Command:
1 - Vvod Treugolnik
2 - Vvod Pryamougolnik
3 - Vivod perimetra Treugolnika
4 - Vivod perimetra Pryamougolnika
5 - Vivod perimetra Treugolnika BIN
6 - Vivod perimetra Pryamougolnika BIN
7 - Save
8 - Restore
9 - Exit
5
Treugolnik
Perimetr imeet 2 edinits
Enter Command:
1 - Vvod Treugolnik
2 - Vvod Pryamougolnik
3 - Vivod perimetra Treugolnika
4 - Vivod perimetra Pryamougolnika
5 - Vivod perimetra Treugolnika BIN
6 - Vivod perimetra Pryamougolnika BIN
7 - Save
8 - Restore
9 – Exit