/* latihan implementasi abstract class untuk design pattern  */

public abstract class kendaraan{
public abstract void operasi();
}

class Maju extends kendaraan{
private Mobil mobil;

public Maju(Mobil mobil){
this.mobil=mobil;
}

public void operasi(){  //override method operasi di class kendaraan
this.mobil.setMaju();

}

}


class Mundur extends kendaraan{
private Mobil mobil;

public Mundur(Mobil mobil){
this.mobil=mobil;
}

public void operasi(){  //override method operasi di class kendaraan
this.mobil.setMundur();

}

}

class Mobil {
private String jenis;
private String status;

public Mobil(){
}
public final void setJenis(String jns){
jenis=jns;
}
public final void setStatus(String stt){
status=stt;
}
public final String getJenis(){
return jenis;
}
public final String getStatus(){
return status;
}
public void setMaju(){
this.setStatus(this.getJenis()+” sedang maju..”);
}
public void setMundur(){
this.setStatus(this.getJenis()+” sedang mundur..”);
}

public String toStr(){
return (“Jenis Mobil : “+this.getStatus());
}

}
class DrvMobil{
public static void main (String []args){
Mobil kijang=new Mobil();
Mobil jazz=new Mobil();

kijang.setJenis(“Kijang”+” Family Car”);
jazz.setJenis(“Jazz”+” City Car”);

System.out.println(kijang.getJenis());
System.out.println(jazz.getJenis());

kendaraan kjgMj=new Maju(kijang);
kendaraan jzzMj=new Maju(jazz);

kendaraan kjgMr=new Mundur(kijang);
kendaraan jzzMr=new Mundur(jazz);

kjgMj.operasi();
jzzMj.operasi();

System.out.println(“maju keduanya nih”);
System.out.println(kijang.toStr());
System.out.println(jazz.toStr());

kjgMr.operasi();
jzzMr.operasi();

System.out.println(“mundur keduanya nih”);
System.out.println(kijang.toStr());
System.out.println(jazz.toStr());

kjgMj.operasi();
jzzMr.operasi();
System.out.println(“satu maju satu mundur”);
System.out.println(kijang.toStr());
System.out.println(jazz.toStr());

}
}