Tight Coupling
In complex cases the logic of one class will call the logic of another class just to provide the same service
If this happen there is the so called tight-coupling between the two classes.
In this case the first class that wants to call the logic from the second class will have to create an object from the second class
Example: we have two classes first is traveller and the second is a car. Traveller class is calling logic of car class; in this case traveller class creates an object of car class.
This will mean the car class will depend on the traveller object.
Public class Traveller {
Car c = new Car();
Public void startJourney() {
c.move();
}
}
Public class Car {
Public void move(){
...
}
}
Here traveller object is tightly coupled with car object.
If traveller wants to change from car to plane then the whole traveller class has to be changed like the following:
Public class Traveller {
Plane p = new Plane();
Public void startJourney() {
p.move();
}
}
Public class Plane {
Public void move(){
...
}
}
Loose Coupling
Our main object, traveller in this case will allow an external entity, a so called container to provide the object. So traveller doesn't have to create an own class from the car or plane object it will get it from the container
When a object allow dependency injection mechanism.
The external entity, the container can inject the car or plane object based on a certain logic, a requirement of the traveller.
Example:
Public class Traveller {
Vehicle v;
Public void setV(Vehicle v) {
this.V = V;
}
Public void startJourney() {
V.move();
}
}
Here traveller class injects either a car or a plane object. No changes required in traveller class if we would like to change the dependency from car to a plane.
Traveller class took a vehicle reference, so an external object (Container) can inject either car object or plane object, depends on requirement of traveller.