Alternative for 5.2

generic-observer
Selebrator 7 years ago
parent cfedacde33
commit 9dcf307707

@ -0,0 +1,62 @@
package _5._2.alternative.bill;
import _5._2.alternative.car.CarComponent;
import java.util.LinkedList;
import java.util.List;
/*
* final damit keiner ein BillItem nach draußen gibt
* und es später wieder als Argument nimmt.
*/
public final class Bill {
private List<BillItem> items = new LinkedList<>();
public double getTotalPrice() {
double sum = 0.0;
for(BillItem item : this.items) {
sum += item.getPrice();
}
return sum;
}
public boolean add(CarComponent item, double price) {
return this.items.add(new BillItem(item, price));
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
double total = 0.0;
for(BillItem item : this.items) {
sb.append(item.toString()).append('\n');
total += item.getPrice();
}
sb.append("Total: ").append(total);
return sb.toString();
}
//inner class und private constructor damit eine Instanz nur als Teil einer Rechnung existieren kann.
public class BillItem {
private final CarComponent item;
private final double price;
private BillItem(CarComponent item, double price) {
//assert item != null;
this.item = item;
this.price = price;
}
public double getPrice() {
return this.price;
}
@Override
public String toString() {
if(this.item.getComponents().isEmpty()) {
return this.item.getName() + ": " + this.price;
}
return this.item.getName() + this.item.getComponents() + ": " + this.price;
}
}
}

@ -0,0 +1,18 @@
package _5._2.alternative.bill;
import _5._2.alternative.car.Motor;
import _5._2.alternative.car.Seat;
import _5._2.alternative.car.Wheel;
public class BillExample {
public static void main(String[] args) {
Bill bill = new Bill();
bill.add(new Motor("Rolls Royce (Motor)"), 100000.0);
bill.add(new Seat(), 2000.0);
bill.add(new Wheel(), 1000.0);
bill.add(new Wheel(), 1000.0);
bill.add(new Wheel(), 1000.0);
bill.add(new Wheel(), 1000.0);
System.out.println(bill);
}
}

@ -0,0 +1,58 @@
package _5._2.alternative.car;
import java.util.HashSet;
import java.util.Set;
public class Car implements CarComponent {
private String name;
private final Set<CarComponent> components = new HashSet<>();
public Car(String name) {
this.name = name;
}
@Override
public String getName() {
return this.name;
}
@Override
public Set<CarComponent> getComponents() {
return this.components;
}
@Override
public String toString() {
if(this.components.isEmpty()) {
return this.name;
}
return this.name + ": " + this.components;
}
public abstract static class CarPart implements CarComponent {
private String name;
private final Set<CarComponent> components = new HashSet<>();
public CarPart(String name) {
this.name = name;
}
@Override
public String getName() {
return this.name;
}
@Override
public Set<CarComponent> getComponents() {
return this.components;
}
@Override
public String toString() {
if(this.components.isEmpty()) {
return this.name;
}
return this.name + ": " + this.components;
}
}
}

@ -0,0 +1,16 @@
package _5._2.alternative.car;
import java.util.Collection;
/*
* Ein Interface hat keinen state.
* Es kann also auch keine Anforderungen an seinen state stellen.
* Um alle geforderten Multiplizitäten sicherzustellen müsste man
* sich daher auf jeden der dies implementiert verlassen,
* dass er sich an die Vereinbarung hällt.
*/
public interface CarComponent {
String getName();
Collection<CarComponent> getComponents();
}

@ -0,0 +1,11 @@
package _5._2.alternative.car;
public class Motor extends Car.CarPart {
public Motor() {
this("Motor");
}
public Motor(String name) {
super(name);
}
}

@ -0,0 +1,11 @@
package _5._2.alternative.car;
public class Seat extends Car.CarPart {
public Seat() {
this("Seat");
}
public Seat(String name) {
super(name);
}
}

@ -0,0 +1,11 @@
package _5._2.alternative.car;
public class Wheel extends Car.CarPart {
public Wheel() {
this("Wheel");
}
public Wheel(String name) {
super(name);
}
}
Loading…
Cancel
Save