Is there any object oriented way or design pattern I can use to make this code better? How can I avoid casting in this code? What if I add new Object like WaterTank
how will it interact with fitting?
Run.java
package main;
import fittings.Fitting;
import fittings.Tap;
import bathroom.Bathroom;
import user.User;
public class Run {
public static void main(String[] args) {
User rutvik = new User("rutvik");
Bathroom bathroom = new Bathroom(rutvik);
bathroom.getBathroomFitting(Fitting.TAP).use(rutvik);
((Tap)bathroom.getBathroomFitting(Fitting.TAP)).controlSpeed();
}
}
User.java
package user;
import bathroom.BathroomUser;
public class User implements BathroomUser {
String userName;
public User(String userName){
System.out.println("constructing user... "+userName);
this.userName=userName;
}
@Override
public String getUserName(){
return userName;
}
}
Bathroom.java
package bathroom;
import java.util.ArrayList;
import user.User;
import fittings.Fitting;
import fittings.Tap;
public class Bathroom {
BathroomUser user;
ArrayList<Fitting> fittings;
public Bathroom(User user){
System.out.println("constructing bathroom...");
System.out.println("assigning user... " + user.getUserName()+" to bathroom");
this.user=user;
fittings=new ArrayList<Fitting>();
fittings.add(new Tap());
}
public Fitting getBathroomFitting(int fittingType){
for(Fitting fitting:fittings){
if(fitting.getFittingType()==fittingType){
return fitting;
}
}
return null;
}
}
BathroomUser.java
package bathroom;
public interface BathroomUser {
public String getUserName();
}
Fittings.java
package fittings;
import bathroom.BathroomUser;
public abstract class Fitting {
public static final int TAP=0;
public static final int SHOWER=1;
public static final int SINK=2;
public abstract void use(BathroomUser user);
public abstract int getFittingType();
}
Tap.java
package fittings;
import bathroom.BathroomUser;
public class Tap extends Fitting {
public Tap() {
System.out.println("constructing TAP fitting...");
}
@Override
public int getFittingType() {
return Fitting.TAP;
}
@Override
public void use(BathroomUser user) {
System.out.println("Tap is in use... by " + user.getUserName());
}
public void controlSpeed(){
System.out.println("Tap Speed Changed");
}
}