Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 25 additions & 54 deletions 05-java-oop-principles/task02/src/com/example/task02/Bill.java
Original file line number Diff line number Diff line change
@@ -1,65 +1,36 @@
package com.example.task02;

import java.util.ArrayList;
import java.util.List;

/**
* Счет к оплате
*/
public class Bill {
private List<BillItem> items = new ArrayList<>();

/**
* Добавляет товар в корзину
*
* @param item товар
* @param amount количество
*/
public void add(Item item, int amount) {
boolean found = false;
for (BillItem billItem: items) {
if (billItem.item.equals(item)) {
found = true;
billItem.amount += amount;
break;
}
}
if (!found) {
items.add(new BillItem(item, amount));
public class DiscountBill extends Bill
{
private final long discount;
/** @param discount процент скидки в промежутке [0;100] */
public DiscountBill(long discount)
{
if (discount >= 0 && discount <= 100)
{
this.discount = discount;
} else
{
throw new IllegalArgumentException("аргумент вне промежутка [0;100]");
}
}

/**
* Подсчитывает общую сумму покупки
*
* @return общую стоимость покупки
*/
public long getPrice() {
long price = 0;
for (BillItem item: items) {
price += item.item.getPrice() * item.amount;
}
return price;
/** @return процент скидки */
public long getDiscount()
{
return discount;
}

@Override
public String toString() {
StringBuilder sb = new StringBuilder("Счет к оплате\n");
for(BillItem item : items) {
sb.append(item.item.getName()).append('(').append(item.amount).append(')');
sb.append('\n');
}
sb.append("Сумма к оплате: ").append(getPrice());
return sb.toString();
/** @return разница между суммой и суммой со скидкой */
public long getDiscountAbsolut()
{
return (long)(super.getPrice() * (discount/100d));
}

private static class BillItem {
final Item item;
int amount;

BillItem(Item item, int amount) {
this.item = item;
this.amount = amount;
}
@Override
public long getPrice()
{
return (super.getPrice() - getDiscountAbsolut());
}
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,27 @@
package com.example.task02;

public class Task02Main {

public class Task02Main
{
private static final Item ITEM1 = new Item("Товар 1", 10);
private static final Item ITEM2 = new Item("Товар 2", 20);
private static final Item ITEM3 = new Item("Товар 3", 30);
private static final Item ITEM4 = new Item("Товар 4", 40);
private static final Item ITEM5 = new Item("Товар 5", 50);
private static final Item ITEM6 = new Item("Товар 6", 60);

public static void main(String[] args) {
public static void main(String[] args)
{
Bill bill = new Bill();
bill.add(ITEM1, 10);
bill.add(ITEM3, 3);
bill.add(ITEM6, 1);
System.out.println(bill);
bill.add(ITEM3, 3);
System.out.println(bill);

DiscountBill db = new DiscountBill(50);
db.add(ITEM1, 10);
db.add(ITEM3, 3);
db.add(ITEM6, 1);
db.add(ITEM3, 3);
System.out.println(db.getPrice());
}
}
}
56 changes: 31 additions & 25 deletions 05-java-oop-principles/task03/src/com/example/task03/TimeUnit.java
Original file line number Diff line number Diff line change
@@ -1,31 +1,37 @@
package com.example.task03;

/**
* Интерфейс для интервалов времени в определенных единицах
*/
public interface TimeUnit {
public class Hours implements TimeUnit
{
private final long amount;

/**
* Возвращает продолжительность текущего интервала, пересчитанного в миллисекундах.
*
* @return количество миллисекунд в текущем интервале
*/
long toMillis();
public Hours(long amount)
{
if (amount < 0)
throw new IllegalArgumentException("amount must be >= 0");
this.amount = amount;
}

/**
* Возвращает продолжительность текущего интервала, пересчитанного в секундах.
* При необходимости округлять по обычным правилам округления (число, меньшее 0.5 переходит в 0, большее или равное - в 1)
*
* @return количество секунд в текущем интервале
*/
long toSeconds();
@Override
public long toMillis()
{
return this.toSeconds() * 1000;
}

/**
* Возвращает продолжительность текущего интервала, пересчитанного в минутах.
* При необходимости округлять по обычным правилам округления (число, меньшее 0.5 переходит в 0, большее или равное - в 1)
*
* @return количество минут в текущем интервале
*/
long toMinutes();
@Override
public long toSeconds()
{
return this.toMinutes() * 60;
}

}
@Override
public long toMinutes()
{
return this.amount * 60;
}

@Override
public long toHours()
{
return this.amount;
}
}