public class FinancialValidator {
private static FinancialValidator instance;
private FinancialValidator() {
recentlyCheckedRequestIds = new ArrayList<>();
}
public static FinancialValidator getInstance() {
if (instance == null) {
instance = new FinancialValidator();
}
return instance;
}
}
public abstract class AbstractIterator<T> {
public abstract T next();
public abstract int getSteps();
public abstract void setSteps(int step);
public abstract boolean isDone();
public abstract T current();
public abstract T first();
}
public class TicketTypeIterator extends AbstractIterator<TicketType> {
private Event event;
private int currentIndex;
private List<TicketType> ticketTypes;
public TicketTypeIterator(Event event) {
this.event = event;
this.ticketTypes = event.getTicketTypes();
this.currentIndex = 0;
}
@Override
public TicketType next() {
if (isDone()) {
throw new IllegalStateException("No more ticket types");
}
TicketType ticketType = ticketTypes.get(currentIndex);
currentIndex++;
return ticketType;
}
// other overridden methods...
}
public abstract class AbstractRecommenderModel {
public abstract List<Event> recommend(int n);
public abstract List<Event> recommend();
}
public class NlpRecommenderModel extends AbstractRecommenderModel {
@Override
public List<Event> recommend(int n) {
// implementation...
}
@Override
public List<Event> recommend() {
// implementation...
}
}
public class PopularityRecommenderModel extends AbstractRecommenderModel {
@Override
public List<Event> recommend(int n) {
// implementation...
}
@Override
public List<Event> recommend() {
// implementation...
}
}
public class EventRecommender {
private int id;
private User user;
private AbstractRecommenderModel model;
private int numberRecommendations;
private List<Event> eventRecommendations;
public EventRecommender(AbstractRecommenderModel model) {
this.user = model.getUser();
this.model = model;
this.numberRecommendations = 3;
this.eventRecommendations = new ArrayList<>();
}
public List<Event> sendRecommendation() {
return eventRecommendations;
}
public void setNumberRecommendations(int numberRecommendations) {
this.numberRecommendations = numberRecommendations;
}
// ...
}
public abstract class PaymentMethod {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected int id;
// common fields if any
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
public class CardPayment extends PaymentMethod {
@Column(nullable = false)
private String cardNumber;
@Column(nullable = false)
private String cardHolder;
@Temporal(TemporalType.DATE)
@Column(nullable = false)
private Date expirationDate;
@Column(nullable = false)
private String cvv;
public CardPayment() {
}
public CardPayment(String cardNumber, String cardHolder, Date expirationDate, String cvv) {
this.cardNumber = cardNumber;
this.cardHolder = cardHolder;
this.expirationDate = expirationDate;
this.cvv = cvv;
}
// ...
}
public class CheckingAccountPayment extends PaymentMethod {
@Column(nullable = false)
private String accountNumber;
@Column(nullable = false)
private String routingNumber;
public CheckingAccountPayment() {
}
public CheckingAccountPayment(String accountNumber, String routingNumber) {
this.accountNumber = accountNumber;
this.routingNumber = routingNumber;
}
// ...
}