├── README.md └── src └── com └── github └── bsferreira └── solid ├── dip ├── dip_solution.uml ├── dip_violation.uml ├── solution │ ├── Driver.java │ ├── RacingCar.java │ └── Vehicle.java └── violation │ ├── Pilot.java │ └── RacingCar.java ├── isp ├── isp_solution.uml ├── isp_violation.uml ├── solution │ ├── CameraSwitch.java │ ├── Car.java │ ├── Drone.java │ ├── EngineSwitch.java │ ├── RadioSwitch.java │ └── Vehicle.java └── violation │ ├── Car.java │ ├── Drone.java │ ├── Switches.java │ └── Vehicle.java ├── lsp ├── lsp_solution.uml ├── lsp_violation.uml ├── solution │ ├── Car.java │ ├── Gear.java │ ├── Plane.java │ └── Vehicle.java └── violation │ ├── Car.java │ ├── Gear.java │ ├── Plane.java │ └── Vehicle.java ├── ocp ├── ocp_solution.uml ├── ocp_violation.uml ├── solution │ ├── Comfort.java │ ├── DrivingMode.java │ ├── Economy.java │ ├── EventHandler.java │ ├── Sport.java │ └── Vehicle.java └── violation │ ├── DrivingMode.java │ ├── EventHandler.java │ └── Vehicle.java └── srp ├── solution ├── FuelPump.java └── Vehicle.java ├── srp_solution.uml ├── srp_violation.uml └── violation └── Vehicle.java /README.md: -------------------------------------------------------------------------------- 1 | # S.O.L.I.D Principles (java examples) 2 | 3 | * **Single responsibility principle** - A class should have only one reason to change. 4 | 5 | * **Open/Closed principle - Software** entities (classes, modules, functions, etc.) should be open for extension, but closed for modification. 6 | 7 | * **Liskov Substitution Principle** - Child classes should never break the parent class type definitions. 8 | 9 | * **Interface Segregation Principle** - No client should be forced to depend on methods it does not use. 10 | 11 | * **Dependency inversion principle** - High-level modules should not depend on low-level modules. Both should depend on abstractions. Abstractions should not depend upon details. Details should depend upon abstractions. 12 | 13 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/dip/dip_solution.uml: -------------------------------------------------------------------------------- 1 | 2 | 3 | JAVA 4 | com.github.bsferreira.solid.dip.solution 5 | 6 | com.github.bsferreira.solid.dip.solution.Vehicle 7 | com.github.bsferreira.solid.dip.solution.RacingCar 8 | com.github.bsferreira.solid.dip.solution.Driver 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | com.github.bsferreira.solid.dip.solution.RacingCar 24 | 25 | 26 | All 27 | private 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/dip/dip_violation.uml: -------------------------------------------------------------------------------- 1 | 2 | 3 | JAVA 4 | com.github.bsferreira.solid.dip.violation 5 | 6 | com.github.bsferreira.solid.dip.violation.RacingCar 7 | com.github.bsferreira.solid.dip.violation.Pilot 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | All 20 | private 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/dip/solution/Driver.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.dip.solution; 2 | 3 | /** 4 | * Created by bsferreira on 17-04-2016. 5 | */ 6 | public class Driver { 7 | 8 | private Vehicle vehicle; 9 | 10 | public Driver(final Vehicle vehicle){ 11 | this.vehicle = vehicle; 12 | } 13 | 14 | public void increaseSpeed(){ 15 | vehicle.accelerate(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/dip/solution/RacingCar.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.dip.solution; 2 | 3 | /** 4 | * Created by bsferreira on 10-04-2016. 5 | */ 6 | public class RacingCar implements Vehicle{ 7 | 8 | private final int maxFuel; 9 | private int remainingFuel; 10 | private int power; 11 | 12 | public RacingCar(final int maxFuel) { 13 | this.maxFuel = maxFuel; 14 | remainingFuel = maxFuel; 15 | } 16 | 17 | @Override 18 | public void accelerate() { 19 | power++; 20 | remainingFuel--; 21 | } 22 | } -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/dip/solution/Vehicle.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.dip.solution; 2 | 3 | /** 4 | * Created by bsferreira on 10-04-2016. 5 | */ 6 | public interface Vehicle { 7 | 8 | void accelerate(); 9 | 10 | } -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/dip/violation/Pilot.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.dip.violation; 2 | 3 | /** 4 | * Created by bsferreira on 17-04-2016. 5 | */ 6 | public class Pilot { 7 | 8 | private RacingCar vehicle; 9 | 10 | public Pilot(){ 11 | this.vehicle = new RacingCar(100); 12 | } 13 | 14 | public void increaseSpeed(){ 15 | vehicle.accelerate(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/dip/violation/RacingCar.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.dip.violation; 2 | 3 | /** 4 | * Created by bsferreira on 10-04-2016. 5 | */ 6 | public class RacingCar { 7 | 8 | private final int maxFuel; 9 | private int remainingFuel; 10 | private int power; 11 | 12 | public RacingCar(final int maxFuel) { 13 | this.maxFuel = maxFuel; 14 | remainingFuel = maxFuel; 15 | } 16 | 17 | public void accelerate(){ 18 | power++; 19 | remainingFuel--; 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/isp/isp_solution.uml: -------------------------------------------------------------------------------- 1 | 2 | 3 | JAVA 4 | com.github.bsferreira.solid.isp.solution 5 | 6 | com.github.bsferreira.solid.isp.solution.Drone 7 | com.github.bsferreira.solid.isp.solution.RadioSwitch 8 | com.github.bsferreira.solid.isp.solution.Vehicle 9 | com.github.bsferreira.solid.isp.solution.Car 10 | com.github.bsferreira.solid.isp.solution.EngineSwitch 11 | com.github.bsferreira.solid.isp.solution.CameraSwitch 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | All 48 | private 49 | 50 | 51 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/isp/isp_violation.uml: -------------------------------------------------------------------------------- 1 | 2 | 3 | JAVA 4 | com.github.bsferreira.solid.isp.violation 5 | 6 | com.github.bsferreira.solid.isp.violation.Switches 7 | com.github.bsferreira.solid.isp.violation.Car 8 | com.github.bsferreira.solid.isp.violation.Drone 9 | com.github.bsferreira.solid.isp.violation.Vehicle 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | All 34 | private 35 | 36 | 37 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/isp/solution/CameraSwitch.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.isp.solution; 2 | 3 | /** 4 | * Created by bsferreira on 16-04-2016. 5 | */ 6 | public interface CameraSwitch { 7 | 8 | void turnCameraOn(); 9 | 10 | void turnCameraOff(); 11 | } 12 | 13 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/isp/solution/Car.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.isp.solution; 2 | 3 | /** 4 | * Created by bsferreira on 10-04-2016. 5 | */ 6 | public class Car extends Vehicle implements RadioSwitch { 7 | 8 | private boolean radioOn; 9 | 10 | public boolean isRadioOn() { 11 | return radioOn; 12 | } 13 | 14 | @Override 15 | public void turnRadioOn() { 16 | radioOn = true; 17 | } 18 | 19 | @Override 20 | public void turnRadioOff() { 21 | radioOn = false; 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/isp/solution/Drone.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.isp.solution; 2 | 3 | /** 4 | * Created by bsferreira on 10-04-2016. 5 | */ 6 | public class Drone extends Vehicle implements CameraSwitch { 7 | 8 | private boolean cameraOn; 9 | 10 | public boolean isCameraOn() { 11 | return cameraOn; 12 | } 13 | 14 | @Override 15 | public void turnCameraOn() { 16 | cameraOn = true; 17 | } 18 | 19 | @Override 20 | public void turnCameraOff() { 21 | cameraOn = false; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/isp/solution/EngineSwitch.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.isp.solution; 2 | 3 | /** 4 | * Created by bsferreira on 16-04-2016. 5 | */ 6 | public interface EngineSwitch { 7 | 8 | void startEngine(); 9 | 10 | void shutDownEngine(); 11 | 12 | } 13 | 14 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/isp/solution/RadioSwitch.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.isp.solution; 2 | 3 | /** 4 | * Created by bsferreira on 16-04-2016. 5 | */ 6 | public interface RadioSwitch { 7 | 8 | void turnRadioOn(); 9 | 10 | void turnRadioOff(); 11 | } 12 | 13 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/isp/solution/Vehicle.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.isp.solution; 2 | 3 | /** 4 | * Created by bsferreira on 10-04-2016. 5 | */ 6 | public abstract class Vehicle implements EngineSwitch { 7 | 8 | private boolean engineRunning; 9 | 10 | public boolean isEngineRunning() { 11 | return engineRunning; 12 | } 13 | 14 | @Override 15 | public void startEngine() { 16 | engineRunning = true; 17 | } 18 | 19 | @Override 20 | public void shutDownEngine() { 21 | engineRunning = false; 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/isp/violation/Car.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.isp.violation; 2 | 3 | /** 4 | * Created by bsferreira on 10-04-2016. 5 | */ 6 | public class Car extends Vehicle { 7 | 8 | private boolean radioOn; 9 | 10 | public boolean isRadioOn() { 11 | return radioOn; 12 | } 13 | 14 | @Override 15 | public void turnRadioOn() { 16 | radioOn = true; 17 | } 18 | 19 | @Override 20 | public void turnRadioOff() { 21 | radioOn = false; 22 | } 23 | 24 | @Override 25 | public void turnCameraOn() { 26 | // nothing to do here 27 | } 28 | 29 | @Override 30 | public void turnCameraOff() { 31 | // nothing to do here 32 | } 33 | } -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/isp/violation/Drone.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.isp.violation; 2 | 3 | /** 4 | * Created by bsferreira on 10-04-2016. 5 | */ 6 | public class Drone extends Vehicle { 7 | 8 | private boolean cameraOn; 9 | 10 | public boolean isCameraOn() { 11 | return cameraOn; 12 | } 13 | 14 | @Override 15 | public void turnCameraOn() { 16 | cameraOn = true; 17 | } 18 | 19 | @Override 20 | public void turnCameraOff() { 21 | cameraOn = false; 22 | } 23 | 24 | @Override 25 | public void turnRadioOn() { 26 | // nothing to do here 27 | } 28 | 29 | @Override 30 | public void turnRadioOff() { 31 | // nothing to do here 32 | } 33 | } -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/isp/violation/Switches.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.isp.violation; 2 | 3 | /** 4 | * Created by bsferreira on 16-04-2016. 5 | */ 6 | public interface Switches { 7 | 8 | void startEngine(); 9 | 10 | void shutDownEngine(); 11 | 12 | void turnRadioOn(); 13 | 14 | void turnRadioOff(); 15 | 16 | void turnCameraOn(); 17 | 18 | void turnCameraOff(); 19 | } 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/isp/violation/Vehicle.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.isp.violation; 2 | 3 | /** 4 | * Created by bsferreira on 10-04-2016. 5 | */ 6 | public abstract class Vehicle implements Switches { 7 | 8 | private boolean engineRunning; 9 | 10 | public boolean isEngineRunning() { 11 | return engineRunning; 12 | } 13 | 14 | @Override 15 | public void startEngine() { 16 | engineRunning = true; 17 | } 18 | 19 | @Override 20 | public void shutDownEngine() { 21 | engineRunning = false; 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/lsp/lsp_solution.uml: -------------------------------------------------------------------------------- 1 | 2 | 3 | JAVA 4 | com.github.bsferreira.solid.lsp.solution 5 | 6 | com.github.bsferreira.solid.lsp.solution.Car 7 | com.github.bsferreira.solid.lsp.solution.Vehicle 8 | com.github.bsferreira.solid.lsp.solution.Plane 9 | com.github.bsferreira.solid.lsp.solution.Gear 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | All 34 | private 35 | 36 | 37 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/lsp/lsp_violation.uml: -------------------------------------------------------------------------------- 1 | 2 | 3 | JAVA 4 | com.github.bsferreira.solid.lsp.violation 5 | 6 | com.github.bsferreira.solid.lsp.violation.Gear 7 | com.github.bsferreira.solid.lsp.violation.Plane 8 | com.github.bsferreira.solid.lsp.violation.Car 9 | com.github.bsferreira.solid.lsp.violation.Vehicle 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | All 34 | private 35 | 36 | 37 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/lsp/solution/Car.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.lsp.solution; 2 | 3 | /** 4 | * Created by bsferreira on 16-04-2016. 5 | */ 6 | public class Car extends Vehicle { 7 | 8 | @Override 9 | public void changeGear(Gear gear) { 10 | Gear actualGear = getGear(); 11 | if (isMovingForwards(gear, actualGear) 12 | || isMovingBackwards(gear, actualGear)) { 13 | stop(); 14 | } 15 | super.changeGear(gear); 16 | } 17 | 18 | private boolean isMovingBackwards(Gear gear, Gear actualGear) { 19 | return isMoving() && Gear.R.equals(actualGear) && Gear.D.equals(gear); 20 | } 21 | 22 | private boolean isMovingForwards(Gear gear, Gear actualGear) { 23 | return isMoving() && Gear.D.equals(actualGear) && Gear.R.equals(gear); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/lsp/solution/Gear.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.lsp.solution; 2 | 3 | /** 4 | * Created by bsferreira on 16-04-2016. 5 | */ 6 | public enum Gear { 7 | P, // Parking 8 | R, // Reverse 9 | N, // Neutral 10 | D // Drive 11 | } 12 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/lsp/solution/Plane.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.lsp.solution; 2 | 3 | /** 4 | * Created by bsferreira on 16-04-2016. 5 | */ 6 | public class Plane extends Vehicle { 7 | 8 | // A plane can reverse engine gear while moving forward, no problem here 9 | } 10 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/lsp/solution/Vehicle.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.lsp.solution; 2 | 3 | /** 4 | * Created by bsferreira on 10-04-2016. 5 | */ 6 | public class Vehicle { 7 | 8 | private boolean isMoving; 9 | private Gear gear; 10 | 11 | public void move(){ 12 | isMoving = true; 13 | } 14 | 15 | public void stop(){ 16 | isMoving = false; 17 | } 18 | 19 | public boolean isMoving() { 20 | return isMoving; 21 | } 22 | 23 | public Gear getGear() { 24 | return gear; 25 | } 26 | 27 | public void changeGear(final Gear gear) { 28 | this.gear = gear; 29 | } 30 | 31 | } -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/lsp/violation/Car.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.lsp.violation; 2 | 3 | /** 4 | * Created by bsferreira on 16-04-2016. 5 | */ 6 | public class Car extends Vehicle { 7 | 8 | @Override 9 | public void changeGear(Gear gear) { 10 | if(Gear.R.equals(gear) && getGear().equals(Gear.D)){ 11 | throw new RuntimeException("Can't change to REVERSE gear when " + getGear().toString() + " gear is engaged!"); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/lsp/violation/Gear.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.lsp.violation; 2 | 3 | /** 4 | * Created by bsferreira on 16-04-2016. 5 | */ 6 | public enum Gear { 7 | P, // Parking 8 | R, // Reverse 9 | N, // Neutral 10 | D // Drive 11 | } 12 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/lsp/violation/Plane.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.lsp.violation; 2 | 3 | /** 4 | * Created by bsferreira on 16-04-2016. 5 | */ 6 | public class Plane extends Vehicle { 7 | 8 | // A plane can reverse engine gear while moving forward, no problem here 9 | } 10 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/lsp/violation/Vehicle.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.lsp.violation; 2 | 3 | /** 4 | * Created by bsferreira on 10-04-2016. 5 | */ 6 | public class Vehicle { 7 | 8 | private Gear gear; 9 | 10 | public Gear getGear() { 11 | return gear; 12 | } 13 | 14 | public void changeGear(final Gear gear) { 15 | this.gear = gear; 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/ocp/ocp_solution.uml: -------------------------------------------------------------------------------- 1 | 2 | 3 | JAVA 4 | com.github.bsferreira.solid.ocp.solution 5 | 6 | com.github.bsferreira.solid.ocp.solution.DrivingMode 7 | com.github.bsferreira.solid.ocp.solution.EventHandler 8 | com.github.bsferreira.solid.ocp.solution.Economy 9 | com.github.bsferreira.solid.ocp.solution.Comfort 10 | com.github.bsferreira.solid.ocp.solution.Vehicle 11 | com.github.bsferreira.solid.ocp.solution.Sport 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | All 40 | private 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/ocp/ocp_violation.uml: -------------------------------------------------------------------------------- 1 | 2 | 3 | JAVA 4 | com.github.bsferreira.solid.ocp.violation 5 | 6 | com.github.bsferreira.solid.ocp.violation.DrivingMode 7 | com.github.bsferreira.solid.ocp.violation.Vehicle 8 | com.github.bsferreira.solid.ocp.violation.EventHandler 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | All 21 | private 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/ocp/solution/Comfort.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.ocp.solution; 2 | 3 | /** 4 | * Created by bsferreira on 16-04-2016. 5 | */ 6 | public class Comfort implements DrivingMode { 7 | 8 | private static final int POWER = 400; 9 | private static final int SUSPENSION_HEIGHT = 20; 10 | 11 | @Override 12 | public int getPower() { 13 | return POWER; 14 | } 15 | 16 | @Override 17 | public int getSuspensionHeight() { 18 | return SUSPENSION_HEIGHT; 19 | } 20 | } 21 | 22 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/ocp/solution/DrivingMode.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.ocp.solution; 2 | 3 | /** 4 | * Created by bsferreira on 16-04-2016. 5 | */ 6 | public interface DrivingMode { 7 | 8 | int getPower(); 9 | int getSuspensionHeight(); 10 | } 11 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/ocp/solution/Economy.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.ocp.solution; 2 | 3 | /** 4 | * Created by bsferreira on 16-04-2016. 5 | */ 6 | public class Economy implements DrivingMode{ 7 | 8 | private static final int POWER = 300; 9 | private static final int SUSPENSION_HEIGHT = 20; 10 | 11 | @Override 12 | public int getPower() { 13 | return POWER; 14 | } 15 | 16 | @Override 17 | public int getSuspensionHeight() { 18 | return SUSPENSION_HEIGHT; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/ocp/solution/EventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.ocp.solution; 2 | 3 | /** 4 | * Created by bsferreira on 16-04-2016. 5 | */ 6 | public class EventHandler { 7 | 8 | private Vehicle vehicle; 9 | 10 | public EventHandler(final Vehicle vehicle) { 11 | this.vehicle = vehicle; 12 | } 13 | 14 | public void changeDrivingMode(final DrivingMode drivingMode){ 15 | vehicle.setPower(drivingMode.getPower()); 16 | vehicle.setSuspensionHeight(drivingMode.getSuspensionHeight()); 17 | // now, when we need to add another mode (e.g. ECONOMY) just create a new class: Economy. 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/ocp/solution/Sport.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.ocp.solution; 2 | 3 | /** 4 | * Created by bsferreira on 16-04-2016. 5 | */ 6 | public class Sport implements DrivingMode { 7 | 8 | private static final int POWER = 500; 9 | private static final int SUSPENSION_HEIGHT = 10; 10 | 11 | @Override 12 | public int getPower() { 13 | return POWER; 14 | } 15 | 16 | @Override 17 | public int getSuspensionHeight() { 18 | return SUSPENSION_HEIGHT; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/ocp/solution/Vehicle.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.ocp.solution; 2 | 3 | /** 4 | * Created by bsferreira on 10-04-2016. 5 | */ 6 | public class Vehicle { 7 | 8 | private int power; 9 | private int suspensionHeight; 10 | 11 | public int getPower() { 12 | return power; 13 | } 14 | 15 | public int getSuspensionHeight() { 16 | return suspensionHeight; 17 | } 18 | 19 | public void setPower(final int power) { 20 | this.power = power; 21 | } 22 | 23 | public void setSuspensionHeight(final int suspensionHeight) { 24 | this.suspensionHeight = suspensionHeight; 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/ocp/violation/DrivingMode.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.ocp.violation; 2 | 3 | /** 4 | * Created by bsferreira on 16-04-2016. 5 | */ 6 | public enum DrivingMode { 7 | SPORT, COMFORT 8 | } 9 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/ocp/violation/EventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.ocp.violation; 2 | 3 | /** 4 | * Created by bsferreira on 16-04-2016. 5 | */ 6 | public class EventHandler { 7 | 8 | private Vehicle vehicle; 9 | 10 | public EventHandler(final Vehicle vehicle) { 11 | this.vehicle = vehicle; 12 | } 13 | 14 | public void changeDrivingMode(final DrivingMode drivingMode){ 15 | switch (drivingMode){ 16 | case SPORT: 17 | vehicle.setPower(500); 18 | vehicle.setSuspensionHeight(10); 19 | break; 20 | case COMFORT: 21 | vehicle.setPower(400); 22 | vehicle.setSuspensionHeight(20); 23 | break; 24 | default: 25 | vehicle.setPower(400); 26 | vehicle.setSuspensionHeight(20); 27 | break; 28 | // when we need to add another mode (e.g. ECONOMY) 2 classes will change DrivingMode and EventHandler. 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/ocp/violation/Vehicle.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.ocp.violation; 2 | 3 | /** 4 | * Created by bsferreira on 10-04-2016. 5 | */ 6 | public class Vehicle { 7 | 8 | private int power; 9 | private int suspensionHeight; 10 | 11 | public int getPower() { 12 | return power; 13 | } 14 | 15 | public int getSuspensionHeight() { 16 | return suspensionHeight; 17 | } 18 | 19 | public void setPower(final int power) { 20 | this.power = power; 21 | } 22 | 23 | public void setSuspensionHeight(final int suspensionHeight) { 24 | this.suspensionHeight = suspensionHeight; 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/srp/solution/FuelPump.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.srp.solution; 2 | 3 | /** 4 | * Created by bsferreira on 10-04-2016. 5 | */ 6 | public class FuelPump { 7 | 8 | public void reFuel(final Vehicle vehicle){ 9 | final int remainingFuel = vehicle.getRemainingFuel(); 10 | final int additionalFuel = vehicle.getMaxFuel() - remainingFuel; 11 | vehicle.setRemainingFuel(remainingFuel + additionalFuel); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/srp/solution/Vehicle.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.srp.solution; 2 | 3 | /** 4 | * Created by bsferreira on 10-04-2016. 5 | */ 6 | public class Vehicle { 7 | 8 | private final int maxFuel; 9 | private int remainingFuel; 10 | 11 | public Vehicle(final int maxFuel) { 12 | this.maxFuel = maxFuel; 13 | remainingFuel = maxFuel; 14 | } 15 | 16 | public int getMaxFuel() { 17 | return maxFuel; 18 | } 19 | 20 | public int getRemainingFuel() { 21 | return remainingFuel; 22 | } 23 | 24 | public void setRemainingFuel(final int remainingFuel) { 25 | this.remainingFuel = remainingFuel; 26 | } 27 | 28 | public void accelerate() { 29 | remainingFuel--; 30 | } 31 | } -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/srp/srp_solution.uml: -------------------------------------------------------------------------------- 1 | 2 | 3 | JAVA 4 | com.github.bsferreira.solid.srp.solution 5 | 6 | com.github.bsferreira.solid.srp.solution.Vehicle 7 | com.github.bsferreira.solid.srp.solution.FuelPump 8 | 9 | 10 | 11 | 12 | 13 | 14 | All 15 | private 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/srp/srp_violation.uml: -------------------------------------------------------------------------------- 1 | 2 | 3 | JAVA 4 | com.github.bsferreira.solid.srp.violation 5 | 6 | com.github.bsferreira.solid.srp.violation.Vehicle 7 | 8 | 9 | 10 | 11 | 12 | com.github.bsferreira.solid.srp.violation.Vehicle 13 | 14 | 15 | All 16 | private 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/com/github/bsferreira/solid/srp/violation/Vehicle.java: -------------------------------------------------------------------------------- 1 | package com.github.bsferreira.solid.srp.violation; 2 | 3 | /** 4 | * Created by bsferreira on 10-04-2016. 5 | */ 6 | public class Vehicle { 7 | 8 | private final int maxFuel; 9 | private int remainingFuel; 10 | 11 | public Vehicle(final int maxFuel) { 12 | this.maxFuel = maxFuel; 13 | remainingFuel = maxFuel; 14 | } 15 | 16 | // this is not a car's responsibility. 17 | public void reFuel(){ 18 | remainingFuel = maxFuel; 19 | } 20 | 21 | public int getMaxFuel() { 22 | return maxFuel; 23 | } 24 | 25 | public int getRemainingFuel() { 26 | return remainingFuel; 27 | } 28 | 29 | public void setRemainingFuel(final int remainingFuel) { 30 | this.remainingFuel = remainingFuel; 31 | } 32 | 33 | public void accelerate() { 34 | remainingFuel--; 35 | } 36 | } 37 | --------------------------------------------------------------------------------