Problema 32

import java.util.NoSuchElementException;

class DimensiuneNegativaCoada extends RuntimeException{

public DimensiuneNegativaCoada(String mesaj){

super(mesaj);

}

}

class NumarMaximElementeAtins extends Exception{

public NumarMaximElementeAtins(String mesaj){

super(mesaj);

}

}

interface Strategie{

public boolean conditie(CardBancar card);

}

class NumeStrategie implements Strategie{

private String numeStrategie;

public NumeStrategie(String numeStrategie){

this.numeStrategie=numeStrategie;

}

public boolean conditie(CardBancar card){

if(numeStrategie.equals(card.getNumeUtilizator()))

return true;

return false;

}

}

class CifreStrategie implements Strategie{

public boolean conditie(CardBancar card){

char[] tmp=card.getNumarCard();

int numbersOf5=0;

for(int i=0;i<tmp.length;i++)

if(String.valueOf(tmp[i]).equals("5"))

numbersOf5++;

if(numbersOf5==3)

return true;

return false;

}

}

class CoadaCarduri{

private final int dimensiuneCoada;

private int numarCarduri;

private CardBancar[] carduri;

private static CoadaCarduri x = null;

public static CoadaCarduri getInstance(int dimensiuneCoada){

if(x==null)x = new CoadaCarduri(dimensiuneCoada);

return x;

}

private CoadaCarduri(int dimensiuneCoada) throws DimensiuneNegativaCoada{

if(dimensiuneCoada<0)

throw new DimensiuneNegativaCoada("Dimensiunea cozii nu poate fi negativa!");

this.dimensiuneCoada=dimensiuneCoada;

carduri=new CardBancar[dimensiuneCoada];

}

public void add(CardBancar cardBancar)throws NumarMaximElementeAtins{

if(numarCarduri==dimensiuneCoada)

throw new NumarMaximElementeAtins("Numarul maxim("+this.dimensiuneCoada+") de carduri a fost atins!");

carduri[numarCarduri]=cardBancar;

numarCarduri++;

}

public CardBancar getPrimulCard()throws NoSuchElementException{

if(dimensiuneCoada==0)

throw new NoSuchElementException("Coada este vida");

return carduri[0];

}

public void stergePrimulCard()throws NoSuchElementException{

if(dimensiuneCoada==0)

throw new NoSuchElementException("Coada este vida");

for(int i=0;i<numarCarduri-1;i++)

carduri[i]=carduri[i+1];

numarCarduri--;

}

public String toString(){

StringBuilder result = new StringBuilder();

for(int i=0;i<numarCarduri;i++)

result.append(carduri[i]).append("\n");

return result.toString();

}

public boolean esteInCoada(Strategie strategie){

for(int i=0;i<numarCarduri;i++)

if(strategie.conditie(carduri[i]))

return true;

return false;

}

}

class CardBancar{

private String numeUtilizator;

private char[] numarCard=new char[16];

public CardBancar(String numeUtilizator, char[] numarCard){

this.numeUtilizator=numeUtilizator;

this.numarCard=numarCard;

}

public String getNumeUtilizator() {

return numeUtilizator;

}

public char[] getNumarCard() {

return numarCard;

}

}

class Maestro extends CardBancar{

public Maestro(String numeUtilizator, char[] numarCard){

super(numeUtilizator,numarCard);

}

public String toString(){

return "Card Maestro:\n"+"Nume utilizator:"+super.getNumeUtilizator()+"\nNumar card:"+String.valueOf(super.getNumarCard())+"\n";

}

}

class VisaMasterCard extends CardBancar{

private char[] numarControl=new char[3];

public VisaMasterCard(String numeUtilizator, char[] numarCard, char[]numarControl){

super(numeUtilizator,numarCard);

this.numarControl=numarControl;

}

public char[] getNumarControl() {

return numarControl;

}

}

class Visa extends VisaMasterCard{

public Visa(String numeUtilizator, char[] numarCard, char[] numarControl){

super(numeUtilizator,numarCard,numarControl);

}

public String toString(){

return "Card Visa:\n"+"Nume utilizator: "+super.getNumeUtilizator()+"\nNumar card: "+String.valueOf(super.getNumarCard())

+"\nNumar control: "+String.valueOf(getNumarControl())+"\n";

}

}

class MasterCard extends VisaMasterCard{

public MasterCard(String numeUtilizator, char[] numarCard, char[] numarControl){

super(numeUtilizator,numarCard,numarControl);

}

public String toString(){

return "Card MasterCard:\n"+"Nume utilizator: "+super.getNumeUtilizator()+"\nNumar card: "+String.valueOf(super.getNumarCard())

+"\nNumar control: "+String.valueOf(getNumarControl())+"\n";

}

}

public class Main {

public static void main(String[] args) {

Maestro maestroCard1=new Maestro("Utilizator1","1555667890123466".toCharArray());

MasterCard masterCard1=new MasterCard("Utilizator2","1234567890123456".toCharArray(),"123".toCharArray());

Visa visaCard1=new Visa("Utilizator3","6543210987654321".toCharArray(),"321".toCharArray());

CoadaCarduri coada1=CoadaCarduri.getInstance(5);

try {

coada1.add(masterCard1);

coada1.add(maestroCard1);

coada1.add(visaCard1);

System.out.println("Primul card:\n"+coada1.getPrimulCard()+"\n");

coada1.stergePrimulCard();

System.out.println("Coada fara primul card:\n"+coada1+"\n");

coada1.add(masterCard1);

System.out.println("Coada dupa reintroducerea primului card la final:\n"+coada1);

} catch (NumarMaximElementeAtins numarMaximElementeAtins) {

numarMaximElementeAtins.printStackTrace();

}

Strategie strategie=new NumeStrategie("Utilizator1");

Strategie strategie1=new CifreStrategie();

Strategie strategie2=new NumeStrategie("Utilizator7");

System.out.println("Utilizator1 se regaseste in coada: "+coada1.esteInCoada(strategie));

System.out.println("Exista cel putin un card care sa aiba de 3 ori cifra 5:"+coada1.esteInCoada(strategie1));

System.out.println("Utilizator7 se regaseste in coada: "+coada1.esteInCoada(strategie2));

}

}