import java.util.ArrayList;
interface IPrinter{
int calculatePagesAvailable();
void updateInkLevel(int nPages);
void printPages(int nPages);
}
abstract class Printer implements IPrinter{
String maker;
String model;
int printedPageCount; // the number of pages a printer ables to print
public Printer(String maker, String model) {
this.maker = maker;
this.model = model;
this.printedPageCount=0;
}
@Override // add the input to the printedPageCount
public void printPages(int nPages) {
this.printedPageCount += nPages;
}
public int getPrintedPageCount() {
return printedPageCount;
}
@Override
public String toString() {
return "Printer{" +
"maker=\'" + maker +
"\', model=\'" + model +
"\', pages Left=" + this.calculatePagesAvailable() +
'}';
}
public String getMaker(){ return this.maker;}
public String getModel(){ return this.model;}
}
class LaserPrinter extends Printer{
double cartridgeSize;
public LaserPrinter(String maker, String model, double cartridgeSize) {
super(maker, model);
this.cartridgeSize = cartridgeSize;
}
@Override
public int calculatePagesAvailable() {
return (int)(this.cartridgeSize/0.05);
}
@Override
public void updateInkLevel(int nPages) {
this.cartridgeSize -= (0.05*nPages);
}
@Override
public void printPages(int nPages) {
int availablePages = this.calculatePagesAvailable();
if(availablePages>=nPages){
super.printPages(nPages);
updateInkLevel(nPages);
}else{
System.out.println("No enough ink for printer "+maker+"-"+model);
}
}
}
class InkjetPrinter extends Printer{
double inkSize;
public InkjetPrinter(String maker, String model,double inkSize) {
super(maker, model);
this.inkSize=inkSize;
}
@Override
public int calculatePagesAvailable() {
return (int)(this.inkSize/0.09);
}
@Override
public void updateInkLevel(int nPages) {
this.inkSize-=(0.09)*nPages;
}
@Override
public void printPages(int nPages) {
int availablePages = this.calculatePagesAvailable();
if(availablePages>=nPages) {
super.printPages(nPages);
this.updateInkLevel(nPages);
}else{
System.out.println("No enough ink");
}
}
}
public class DriverClass {
public static void main(String[] args) {
ArrayList<Printer> printers = new ArrayList<>();
// add Laser and Inkjet printers the same ArrayList
printers.add(new LaserPrinter("HP", "H1", 100));
printers.add(new InkjetPrinter("Cannon", "C1", 150));
printers.add(new LaserPrinter("DELL", "D1", 100));
printers.add(new InkjetPrinter("HP", "H2", 50));
// lets test printer 1
//how many pages do we have
System.out.println(printers.get(0));
// send a task to printer 1 with 100 pages
printers.get(0).printPages(100);
// print number of pages the printer can print
System.out.println(printers.get(0));
// lets test printer 2
System.out.println(printers.get(1));
// send a task to printer 1 with 100 pages
printers.get(1).printPages(50);
// print number of pages the printer can print
System.out.println(printers.get(1));
// now lets send a big task to printer 3
printers.get(2).printPages(5000); // rejected: no enough ink
for (Printer printer : printers)
System.out.printf("For printer %s-%s we have printed %d\n", printer.getMaker(), printer.getModel(), printer.getPrintedPageCount());
}
}