Problema 34

package com.company;

import java.util.ArrayList;

abstract class Amenda{

private String CNP;

public Amenda(String CNP){

this.CNP=CNP;

}

abstract public double getValoareAmenda();

abstract protected String getTip();

public String toString(){

return "\nCNP: " + this.CNP + "\nTip amenda: " + getTip() + "\nValoare amenda: " + getValoareAmenda();

}

public String getCNP(){

return this.CNP;

}

}

class ParcareIlegala extends Amenda{

private static final int AmendaFixa=500;

public ParcareIlegala(String CNP){

super(CNP);

}

public double getValoareAmenda(){

return AmendaFixa;

}

protected String getTip(){

return " Parcare ilegala";

}

}

class AruncatGunoaie extends Amenda{

private int factorZonal;

private static final int coeficientInmultire=200;

public AruncatGunoaie(String CNP, int factorZonal){

super(CNP);

this.factorZonal=factorZonal;

}

public double getValoareAmenda(){

return coeficientInmultire*factorZonal;

}

protected String getTip(){

return "Aruncat gunoaie pe jos";

}

}

class DistrugereaBunurilor extends Amenda{

private double valoareBun;

private static final int coeficientInmultire=300;

public DistrugereaBunurilor(String CNP, double valoareBun){

super(CNP);

this.valoareBun=valoareBun;

}

public double getValoareAmenda(){

return coeficientInmultire*valoareBun;

}

protected String getTip(){

return "Distrugerea bunurilor din parc";

}

}

class ColectieAmenda{

private ArrayList<Amenda> grupAmenzi=new ArrayList<>();

public void add(Amenda amenda){

if(amenda==null){

throw new NullPointerException("Amenda nu poate fi null...Something wrong happend");

}

else{

grupAmenzi.add(amenda);

}

}

public int valoare(Strategie strategie){

double sumaAmenzi=0;

for(Amenda amenda:grupAmenzi)

if(strategie.conditie(amenda))

sumaAmenzi=sumaAmenzi+amenda.getValoareAmenda();

return (int) sumaAmenzi;

}

}

interface Strategie{

public boolean conditie(Amenda amenda);

}

class VerificareCNP implements Strategie{

private String CNP;

public VerificareCNP(String CNP){

this.CNP=CNP;

}

public boolean conditie(Amenda amenda) {

if(amenda.getCNP().equals(this.CNP))

return true;

return false;

}

}

class VerificareParcare implements Strategie{

private static final String tip= ParcareIlegala.class.getTypeName();

public boolean conditie(Amenda amenda){

if(amenda.getClass().getTypeName().equals(tip))

return true;

return false;

}

}

public class Main {

public static void main(String[] args) {

ColectieAmenda grup=new ColectieAmenda();

Amenda amenda=new DistrugereaBunurilor("123",10);

ParcareIlegala amenda1=new ParcareIlegala("1031274456709");

Amenda amenda2=new AruncatGunoaie("1031274456709",2);

grup.add(amenda);

grup.add(amenda1);

grup.add(amenda2);

Strategie strategie=new VerificareCNP("1031274456709");

Strategie strategie1=new VerificareParcare();

System.out.println(grup.valoare(strategie));

System.out.println(grup.valoare(strategie1));

}

}