├── .gitattributes ├── .github ├── FUNDING.yml └── dependabot.yml ├── .gitignore ├── EXERCISES.md ├── LICENSE ├── README.md ├── pom.xml ├── swcs-authentication ├── pom.xml └── src │ └── main │ └── java │ └── swcs │ └── authentication │ ├── after │ ├── Authentication.java │ ├── AuthenticationManager.java │ ├── AuthenticationProvider.java │ ├── DatabaseAuthenticationProvider.java │ └── LDAPAuthenticationProvider.java │ └── before │ ├── AuthenticationManager.java │ ├── DatabaseAuthenticationProvider.java │ └── User.java ├── swcs-clean ├── pom.xml └── src │ └── main │ └── java │ └── swcs │ └── clean │ ├── bikestore │ └── before │ │ ├── Bike.java │ │ └── BikeStore.java │ ├── car │ └── before │ │ └── ImmutableCar.java │ └── license │ └── before │ ├── LicenceType.java │ └── Licences.java ├── swcs-compression ├── pom.xml └── src │ └── main │ └── java │ └── swcs │ └── converter │ ├── after │ ├── Client.java │ ├── Compression.java │ ├── CompressionFactory.java │ ├── CompressionType.java │ ├── Converter.java │ ├── JpgCompression.java │ └── PngCompression.java │ └── before │ ├── Client.java │ └── Converter.java ├── swcs-dp ├── .gitignore ├── README.md ├── pom.xml └── src │ └── main │ ├── java │ └── swcs │ │ └── dp │ │ ├── adp │ │ ├── after │ │ │ ├── p1 │ │ │ │ ├── A.java │ │ │ │ └── CImpl.java │ │ │ ├── p2 │ │ │ │ └── B.java │ │ │ └── p3 │ │ │ │ └── C.java │ │ └── before │ │ │ ├── p1 │ │ │ └── A.java │ │ │ ├── p2 │ │ │ └── B.java │ │ │ └── p3 │ │ │ └── C.java │ │ ├── dip │ │ ├── logger │ │ │ ├── after │ │ │ │ ├── Client.java │ │ │ │ ├── Database.java │ │ │ │ ├── FileSystem.java │ │ │ │ ├── Loggable.java │ │ │ │ └── Logger.java │ │ │ └── before │ │ │ │ ├── FileSystem.java │ │ │ │ └── Logger.java │ │ └── userservice │ │ │ ├── after │ │ │ ├── UserRepository.java │ │ │ └── UserService.java │ │ │ └── before │ │ │ ├── UserRepository.java │ │ │ ├── UserRepositoryHibernate.java │ │ │ └── UserService.java │ │ ├── isp │ │ ├── printer │ │ │ ├── after │ │ │ │ ├── AllInOnePrinter.java │ │ │ │ ├── Fax.java │ │ │ │ ├── InkjetPrinter.java │ │ │ │ ├── Printer.java │ │ │ │ └── Scanner.java │ │ │ └── before │ │ │ │ ├── AllInOnePrinter.java │ │ │ │ ├── InkjetPrinter.java │ │ │ │ └── MultiFunctionDevice.java │ │ ├── stockorder │ │ │ ├── after │ │ │ │ ├── Price.java │ │ │ │ ├── StockId.java │ │ │ │ └── StockOrder.java │ │ │ └── before │ │ │ │ ├── StockId.java │ │ │ │ └── StockOrder.java │ │ └── techemployee │ │ │ ├── after │ │ │ ├── Designer.java │ │ │ ├── Developer.java │ │ │ ├── JavaDeveloper.java │ │ │ ├── SecurityTester.java │ │ │ ├── Tester.java │ │ │ └── UIDesigner.java │ │ │ └── before │ │ │ ├── Designer.java │ │ │ ├── JavaDeveloper.java │ │ │ ├── TechEmployee.java │ │ │ └── Tester.java │ │ ├── lsp │ │ ├── bird │ │ │ ├── after │ │ │ │ ├── Bird.java │ │ │ │ ├── Penguin.java │ │ │ │ └── Sparrow.java │ │ │ └── before │ │ │ │ ├── Bird.java │ │ │ │ ├── Penguin.java │ │ │ │ └── Sparrow.java │ │ ├── coupon │ │ │ ├── after │ │ │ │ ├── Client.java │ │ │ │ ├── Coupon.java │ │ │ │ ├── PromotionCoupon.java │ │ │ │ └── RegularCoupon.java │ │ │ └── before │ │ │ │ ├── Client.java │ │ │ │ ├── Coupon.java │ │ │ │ └── PromotionCoupon.java │ │ └── figure │ │ │ ├── after │ │ │ ├── Circle.java │ │ │ ├── Client.java │ │ │ ├── Figure.java │ │ │ ├── Rectangle.java │ │ │ └── Square.java │ │ │ └── before │ │ │ ├── Client.java │ │ │ ├── Rectangle.java │ │ │ └── Square.java │ │ ├── ocp │ │ ├── calculator │ │ │ ├── after │ │ │ │ ├── Calculator.java │ │ │ │ └── Operation.java │ │ │ └── before │ │ │ │ └── Calculator.java │ │ ├── humanresource │ │ │ ├── after │ │ │ │ ├── Developer.java │ │ │ │ ├── Employee.java │ │ │ │ ├── HumanResourceDepartment.java │ │ │ │ ├── Manager.java │ │ │ │ └── Secretary.java │ │ │ └── before │ │ │ │ ├── Developer.java │ │ │ │ ├── HumanResourceDepartment.java │ │ │ │ └── Manager.java │ │ ├── loanvalidator │ │ │ ├── after │ │ │ │ ├── BusinessLoanValidator.java │ │ │ │ ├── Client.java │ │ │ │ ├── LoanRequestHandler.java │ │ │ │ ├── PersonalLoanValidator.java │ │ │ │ └── Validator.java │ │ │ └── before │ │ │ │ ├── Client.java │ │ │ │ ├── LoanRequestHandler.java │ │ │ │ └── PersonalLoanValidator.java │ │ ├── parser │ │ │ ├── after │ │ │ │ ├── Client.java │ │ │ │ ├── FileParser.java │ │ │ │ ├── FileParserFactory.java │ │ │ │ ├── JsonParser.java │ │ │ │ └── XmlParser.java │ │ │ └── before │ │ │ │ └── FileParser.java │ │ └── shape │ │ │ ├── after │ │ │ ├── Circle.java │ │ │ ├── Client.java │ │ │ ├── Shape.java │ │ │ └── Square.java │ │ │ └── before │ │ │ ├── Circle.java │ │ │ ├── Client.java │ │ │ ├── Shape.java │ │ │ └── Square.java │ │ └── srp │ │ ├── book │ │ ├── after │ │ │ ├── Book.java │ │ │ ├── BookExporter.java │ │ │ ├── EpubExporter.java │ │ │ └── PdfExporter.java │ │ └── before │ │ │ └── Book.java │ │ ├── modem │ │ ├── after │ │ │ ├── Client.java │ │ │ ├── Connection.java │ │ │ ├── DataChannel.java │ │ │ └── Modem.java │ │ └── before │ │ │ └── Modem.java │ │ └── product │ │ ├── after │ │ ├── DiscountCalculator.java │ │ └── Product.java │ │ └── before │ │ └── Product.java │ └── resources │ └── META-INF │ └── services │ └── swcs.dp.ocp.parser.after.FileParser ├── swcs-gof ├── README.md ├── pom.xml └── src │ └── main │ └── java │ └── swcs │ └── gof │ ├── behavioral │ ├── chainofresponsibility │ │ ├── authentication │ │ │ ├── AbstractAuthenticationFilter.java │ │ │ ├── Authentication.java │ │ │ ├── AuthenticationFilter.java │ │ │ ├── BasicAuthentication.java │ │ │ ├── BasicAuthenticationFilter.java │ │ │ ├── BearerAuthentication.java │ │ │ ├── BearerAuthenticationFilter.java │ │ │ ├── Client.java │ │ │ ├── DigestAuthentication.java │ │ │ └── DigestAuthenticationFilter.java │ │ └── purchase │ │ │ ├── AbstractEmployee.java │ │ │ ├── CTO.java │ │ │ ├── Client.java │ │ │ ├── Employee.java │ │ │ ├── Purchase.java │ │ │ ├── PurchaseAuthorizeFlow.java │ │ │ ├── TeamLead.java │ │ │ └── VP.java │ ├── command │ │ ├── filesystem │ │ │ ├── BatchFileSystemExecutor.java │ │ │ ├── Client.java │ │ │ ├── Command.java │ │ │ ├── CreateCommand.java │ │ │ ├── DeleteCommand.java │ │ │ ├── FileSystem.java │ │ │ └── MoveCommand.java │ │ └── television │ │ │ ├── Client.java │ │ │ ├── Command.java │ │ │ ├── DeviceButton.java │ │ │ ├── Television.java │ │ │ ├── TurnOff.java │ │ │ ├── TurnOn.java │ │ │ ├── VolumeDown.java │ │ │ └── VolumeUp.java │ ├── interpreter │ │ ├── calculator │ │ │ ├── Client.java │ │ │ ├── Evaluator.java │ │ │ ├── Expression.java │ │ │ ├── Minus.java │ │ │ ├── Number.java │ │ │ └── Plus.java │ │ └── hexbinary │ │ │ ├── Client.java │ │ │ ├── Context.java │ │ │ ├── Expression.java │ │ │ ├── IntToBinaryExpression.java │ │ │ └── IntToHexExpression.java │ ├── iterator │ │ ├── extern │ │ │ └── cars │ │ │ │ ├── Car.java │ │ │ │ ├── CarIterator.java │ │ │ │ └── Client.java │ │ └── intern │ │ │ └── cars │ │ │ ├── Car.java │ │ │ └── Client.java │ ├── mediator │ │ ├── aircraft │ │ │ ├── Aircraft.java │ │ │ ├── AircraftColleague.java │ │ │ ├── AircraftMediator.java │ │ │ ├── AircraftTrafficControlRoom.java │ │ │ ├── Client.java │ │ │ └── Runway.java │ │ └── chat │ │ │ ├── AnonymousUser.java │ │ │ ├── Chat.java │ │ │ ├── ChatMediator.java │ │ │ ├── Client.java │ │ │ ├── LoggedInUser.java │ │ │ └── User.java │ ├── memento │ │ ├── balance │ │ │ ├── CareTaker.java │ │ │ ├── Client.java │ │ │ ├── Memento.java │ │ │ └── Originator.java │ │ └── editor │ │ │ ├── CleanCodeEditor.java │ │ │ ├── CleanCodeEditorState.java │ │ │ ├── Client.java │ │ │ ├── Editor.java │ │ │ ├── EditorState.java │ │ │ └── History.java │ ├── observer │ │ ├── datastore │ │ │ ├── Client.java │ │ │ ├── DataStore.java │ │ │ ├── Screen.java │ │ │ └── SecondScreen.java │ │ └── influencer │ │ │ ├── Client.java │ │ │ ├── Follower.java │ │ │ ├── Influencer.java │ │ │ ├── Observer.java │ │ │ └── Subject.java │ ├── state │ │ ├── door │ │ │ ├── Client.java │ │ │ ├── Door.java │ │ │ ├── DoorClosed.java │ │ │ ├── DoorClosing.java │ │ │ ├── DoorOpen.java │ │ │ ├── DoorOpening.java │ │ │ └── DoorState.java │ │ └── mp3player │ │ │ ├── Client.java │ │ │ ├── MP3Player.java │ │ │ ├── PlayingState.java │ │ │ ├── StandByState.java │ │ │ └── State.java │ ├── strategy │ │ ├── compression │ │ │ ├── Client.java │ │ │ ├── CompressionContext.java │ │ │ ├── CompressionStrategy.java │ │ │ ├── RarCompressionStrategy.java │ │ │ └── ZipCompressionStrategy.java │ │ ├── logformatter │ │ │ ├── Client.java │ │ │ ├── FullLogFormatter.java │ │ │ ├── GitConsole.java │ │ │ ├── Log.java │ │ │ ├── LogFormatter.java │ │ │ ├── OnelineLogFormatter.java │ │ │ └── ShortLogFormatter.java │ │ └── order │ │ │ ├── Client.java │ │ │ ├── CreditCardPayment.java │ │ │ ├── Order.java │ │ │ ├── OrderProcessor.java │ │ │ ├── PayPalPayment.java │ │ │ └── PaymentStrategy.java │ ├── templatemethod │ │ ├── callbackable │ │ │ ├── AbstractCallbackRunnable.java │ │ │ ├── Callbackable.java │ │ │ ├── Client.java │ │ │ ├── DefaultCallbackRunnable.java │ │ │ └── Status.java │ │ └── compiler │ │ │ ├── AndroidCompiler.java │ │ │ ├── Client.java │ │ │ ├── CrossCompiler.java │ │ │ └── IPhoneCompiler.java │ └── visitor │ │ ├── figures │ │ ├── AreaVisitor.java │ │ ├── Circle.java │ │ ├── Client.java │ │ ├── Figure.java │ │ ├── PerimeterVisitor.java │ │ ├── Rectangle.java │ │ ├── Square.java │ │ └── Visitor.java │ │ └── fridge │ │ ├── Beer.java │ │ ├── BestBeforeDateVisitor.java │ │ ├── Butter.java │ │ ├── Client.java │ │ ├── FridgeElement.java │ │ ├── Milk.java │ │ └── Visitor.java │ ├── creational │ ├── abstractfactory │ │ └── car │ │ │ ├── AutoSearchUI.java │ │ │ ├── Car.java │ │ │ ├── Client.java │ │ │ ├── LuxuryCar.java │ │ │ ├── LuxurySUV.java │ │ │ ├── LuxuryVehicleFactory.java │ │ │ ├── NonLuxuryCar.java │ │ │ ├── NonLuxurySUV.java │ │ │ ├── NonLuxuryVehicleFactory.java │ │ │ ├── SUV.java │ │ │ └── VehicleFactory.java │ ├── builder │ │ ├── email │ │ │ ├── Client.java │ │ │ └── Email.java │ │ ├── meal │ │ │ ├── AdultMealBuilder.java │ │ │ ├── Client.java │ │ │ ├── KidsMealBuilder.java │ │ │ ├── Meal.java │ │ │ ├── MealBuilder.java │ │ │ └── MealDirector.java │ │ ├── person │ │ │ ├── Client.java │ │ │ └── ImmutablePerson.java │ │ └── pizza │ │ │ ├── Client.java │ │ │ ├── HawaiianPizzaBuilder.java │ │ │ ├── Luigi.java │ │ │ ├── MargheritaPizzaBuilder.java │ │ │ ├── Pizza.java │ │ │ └── PizzaBuilder.java │ ├── factorymethod │ │ ├── department │ │ │ ├── Client.java │ │ │ ├── Department.java │ │ │ ├── Employee.java │ │ │ ├── MarketingDepartment.java │ │ │ ├── MarketingSpecialist.java │ │ │ ├── Programmer.java │ │ │ └── TechDepartment.java │ │ └── logger │ │ │ ├── AbstractLoggerCreator.java │ │ │ ├── Client.java │ │ │ ├── ConsoleLogger.java │ │ │ ├── ConsoleLoggerCreator.java │ │ │ └── Logger.java │ ├── prototype │ │ ├── copy │ │ │ └── person │ │ │ │ ├── Address.java │ │ │ │ ├── Client.java │ │ │ │ └── Person.java │ │ ├── deep │ │ │ └── person │ │ │ │ ├── Address.java │ │ │ │ ├── Client.java │ │ │ │ └── Person.java │ │ └── shallow │ │ │ └── person │ │ │ ├── Address.java │ │ │ ├── Client.java │ │ │ └── Person.java │ └── singleton │ │ ├── eager │ │ ├── Client.java │ │ └── Singleton.java │ │ ├── lazy │ │ ├── Client.java │ │ └── Singleton.java │ │ └── usingenum │ │ ├── Client.java │ │ └── Singleton.java │ └── structural │ ├── adapter │ ├── sorter │ │ ├── Client.java │ │ ├── NumberSorter.java │ │ ├── SortListAdapter.java │ │ └── Sorter.java │ └── textformatter │ │ ├── Client.java │ │ ├── CsvAdapter.java │ │ ├── CsvFormattable.java │ │ ├── CsvFormatter.java │ │ ├── NewlineFormatter.java │ │ └── TextFormattable.java │ ├── bridge │ ├── message │ │ ├── Client.java │ │ ├── EmailMessage.java │ │ ├── EmailMessageSender.java │ │ ├── Message.java │ │ ├── MessageSender.java │ │ ├── SmsMessage.java │ │ └── SmsMessageSender.java │ └── television │ │ ├── Client.java │ │ ├── Philips.java │ │ ├── RemoteControl.java │ │ ├── Samsung.java │ │ ├── SmartRemoteControl.java │ │ └── Television.java │ ├── composite │ ├── graphic │ │ ├── Client.java │ │ ├── Column.java │ │ ├── Component.java │ │ ├── Composite.java │ │ ├── Row.java │ │ └── Sheet.java │ └── organizationchart │ │ ├── CTO.java │ │ ├── Client.java │ │ ├── Developer.java │ │ ├── DisciplinaryLeadership.java │ │ ├── Employee.java │ │ └── VP.java │ ├── decorator │ ├── message │ │ ├── Client.java │ │ ├── DefaultMessage.java │ │ ├── Message.java │ │ ├── TimeStampMessage.java │ │ └── UpperCaseMessage.java │ └── window │ │ ├── Client.java │ │ ├── DecoratedWindow.java │ │ ├── ScrollableWindow.java │ │ ├── SimpleWindow.java │ │ └── Window.java │ ├── facade │ ├── smarthome │ │ ├── Client.java │ │ ├── LightController.java │ │ ├── SecuritySystem.java │ │ ├── SmartHomeFacade.java │ │ └── ThermostatController.java │ └── travel │ │ ├── Client.java │ │ ├── Flight.java │ │ ├── FlightBooker.java │ │ ├── Hotel.java │ │ ├── HotelBooker.java │ │ ├── TravelFacade.java │ │ └── Travels.java │ ├── flyweight │ ├── city │ │ ├── City.java │ │ ├── CityFactory.java │ │ ├── Client.java │ │ └── Person.java │ └── font │ │ ├── Client.java │ │ ├── Font.java │ │ └── FontFactory.java │ └── proxy │ ├── imageviewer │ ├── Client.java │ ├── DefaultImageViewer.java │ ├── Image.java │ ├── ImageViewer.java │ └── ImageViewerProxy.java │ └── spaceship │ ├── Client.java │ ├── MillenniumFalcon.java │ ├── MillenniumFalconProxy.java │ ├── Pilot.java │ └── Spaceship.java ├── swcs-junit ├── pom.xml └── src │ ├── main │ └── java │ │ └── swcs │ │ └── junit │ │ ├── converter │ │ └── FahrenheitCelsiusConverter.java │ │ ├── football │ │ └── FootballTeam.java │ │ └── fridge │ │ ├── Fridge.java │ │ └── NoSuchItemException.java │ └── test │ └── java │ └── swcs │ └── junit │ ├── converter │ └── FahrenheitCelsiusConverterTest.java │ ├── football │ └── FootballTeamTest.java │ └── fridge │ └── FridgeTest.java ├── swcs-layering ├── pom.xml └── src │ └── main │ └── java │ └── swcs │ └── layering │ ├── after │ ├── reservation │ │ ├── ReservationController.java │ │ ├── ReservationRepository.java │ │ └── ReservationService.java │ └── ticket │ │ ├── TicketController.java │ │ ├── TicketRepository.java │ │ └── TicketService.java │ └── before │ ├── repository │ ├── ReservationRepository.java │ └── TicketRepository.java │ ├── service │ ├── ReservationService.java │ └── TicketService.java │ └── web │ ├── ReservationController.java │ └── TicketController.java ├── swcs-mockito ├── pom.xml └── src │ ├── main │ └── java │ │ └── swcs │ │ └── mockito │ │ ├── carsearch │ │ ├── Car.java │ │ ├── CarSearch.java │ │ ├── Engine.java │ │ └── Manufacturer.java │ │ └── raceresults │ │ ├── Client.java │ │ ├── Message.java │ │ └── RaceResultsService.java │ └── test │ └── java │ └── swcs │ └── mockito │ ├── carsearch │ └── CarSearchTest.java │ └── raceresults │ └── RaceResultsServiceTest.java ├── swcs-order ├── pom.xml └── src │ └── main │ └── java │ └── swcs │ └── order │ ├── after │ ├── Exporter.java │ ├── Importer.java │ ├── JsonExporter.java │ ├── JsonImporter.java │ ├── Order.java │ ├── XmlExporter.java │ └── XmlImporter.java │ └── before │ └── Order.java ├── swcs-playground ├── pom.xml └── src │ ├── main │ └── java │ │ └── swcs │ │ └── playground │ │ └── Playground.java │ └── test │ └── java │ └── swcs │ └── playground │ └── PlaygroundTest.java └── swcs-rental ├── pom.xml └── src └── main └── java └── swcs └── rental ├── after ├── AbstractMovie.java ├── ChildrenMovie.java ├── Customer.java ├── Movie.java ├── NewReleaseMovie.java ├── RegularMovie.java ├── Rental.java └── Tester.java └── before ├── Customer.java ├── Movie.java ├── Rental.java └── Tester.java /.gitattributes: -------------------------------------------------------------------------------- 1 | # Set the default behavior, in case people dont have core.autocrlf set. 2 | * text=auto 3 | 4 | # Explicitly declare text files you want to always be normalized and converted 5 | # to native line endings on checkout. 6 | #*.c text 7 | #*.h text 8 | 9 | # Declare files that will always have CRLF line endings on checkout. 10 | #*.sln text eol=crlf 11 | 12 | # Declare files that will always have LF line endings on checkout. 13 | *.sh text eol=lf 14 | 15 | # Denote all files that are truly binary and should not be modified. 16 | #*.png binary 17 | #*.jpg binary -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [mnhock] 4 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: maven 4 | directory: "/" 5 | schedule: 6 | interval: "daily" 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Set the default behavior, in case people dont have core.autocrlf set. 2 | * text=auto 3 | 4 | target/ 5 | !.mvn/wrapper/maven-wrapper.jar 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | 15 | ### IntelliJ IDEA ### 16 | .idea 17 | *.iws 18 | *.iml 19 | *.ipr 20 | 21 | ### NetBeans ### 22 | nbproject/private/ 23 | build/ 24 | nbbuild/ 25 | dist/ 26 | nbdist/ 27 | .nb-gradle/ 28 | 29 | ### Node ### 30 | /node/ 31 | node_tmp/ 32 | node_modules/ 33 | npm-debug.log.* 34 | 35 | -------------------------------------------------------------------------------- /EXERCISES.md: -------------------------------------------------------------------------------- 1 | # Exercises 2 | 3 | ## Clean code 4 | 1. Video: https://www.infoq.com/presentations/Robert-C.-Martin-Bad-Code/ 5 | 2. Code: https://github.com/mnhock/swcs/tree/master/swcs-clean 6 | 7 | ## JUnit 8 | 1. Video: https://www.youtube.com/watch?v=fr1E9aVnBxw 9 | 2. Code: https://github.com/mnhock/swcs/tree/master/swcs-junit 10 | 11 | ## Mockito 12 | 1. Code: https://github.com/mnhock/swcs/tree/master/swcs-mockito 13 | 14 | ## Design Principles 15 | 1. Code: https://github.com/mnhock/swcs/tree/master/swcs-authentication 16 | 2. Code: https://github.com/mnhock/swcs/tree/master/swcs-order 17 | 18 | 19 | ## Design Patterns 20 | 1. Code: https://github.com/mnhock/swcs/tree/master/swcs-rental 21 | 2. Code: https://github.com/mnhock/swcs/tree/master/swcs-compression 22 | -------------------------------------------------------------------------------- /swcs-authentication/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | 8 | swcs-parent 9 | 0.0.1-SNAPSHOT 10 | swcs 11 | 12 | 13 | swcs-authentication 14 | swcs-clean 15 | jar 16 | 17 | -------------------------------------------------------------------------------- /swcs-authentication/src/main/java/swcs/authentication/after/Authentication.java: -------------------------------------------------------------------------------- 1 | package swcs.authentication.after; 2 | 3 | public interface Authentication { 4 | 5 | int id(); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /swcs-authentication/src/main/java/swcs/authentication/after/AuthenticationManager.java: -------------------------------------------------------------------------------- 1 | package swcs.authentication.after; 2 | 3 | public class AuthenticationManager { 4 | 5 | private final AuthenticationProvider provider; 6 | 7 | public AuthenticationManager(AuthenticationProvider provider) { 8 | this.provider = provider; 9 | } 10 | 11 | public void login(Authentication authentication) { 12 | this.provider.authenticate(authentication); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /swcs-authentication/src/main/java/swcs/authentication/after/AuthenticationProvider.java: -------------------------------------------------------------------------------- 1 | package swcs.authentication.after; 2 | 3 | public interface AuthenticationProvider { 4 | 5 | boolean authenticate(Authentication authentication); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /swcs-authentication/src/main/java/swcs/authentication/after/DatabaseAuthenticationProvider.java: -------------------------------------------------------------------------------- 1 | package swcs.authentication.after; 2 | 3 | public class DatabaseAuthenticationProvider implements AuthenticationProvider { 4 | 5 | @Override 6 | public boolean authenticate(Authentication authentication) { 7 | // logic 8 | return true; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /swcs-authentication/src/main/java/swcs/authentication/after/LDAPAuthenticationProvider.java: -------------------------------------------------------------------------------- 1 | package swcs.authentication.after; 2 | 3 | public class LDAPAuthenticationProvider implements AuthenticationProvider { 4 | 5 | @Override 6 | public boolean authenticate(Authentication authentication) { 7 | // logic 8 | return true; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /swcs-authentication/src/main/java/swcs/authentication/before/AuthenticationManager.java: -------------------------------------------------------------------------------- 1 | package swcs.authentication.before; 2 | 3 | public class AuthenticationManager { 4 | 5 | private final DatabaseAuthenticationProvider provider = new DatabaseAuthenticationProvider(); 6 | 7 | public void login(User user) { 8 | this.provider.authenticate(user); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /swcs-authentication/src/main/java/swcs/authentication/before/DatabaseAuthenticationProvider.java: -------------------------------------------------------------------------------- 1 | package swcs.authentication.before; 2 | 3 | public class DatabaseAuthenticationProvider { 4 | 5 | public boolean authenticate(User user) { 6 | // logic 7 | return true; 8 | } 9 | } -------------------------------------------------------------------------------- /swcs-authentication/src/main/java/swcs/authentication/before/User.java: -------------------------------------------------------------------------------- 1 | package swcs.authentication.before; 2 | 3 | public class User { 4 | 5 | private final int id; 6 | 7 | public User(int id) { 8 | this.id = id; 9 | } 10 | 11 | public int id() { 12 | return this.id; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /swcs-clean/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | 8 | swcs-parent 9 | 0.0.1-SNAPSHOT 10 | swcs 11 | 12 | 13 | swcs-clean 14 | swcs-clean 15 | jar 16 | 17 | -------------------------------------------------------------------------------- /swcs-clean/src/main/java/swcs/clean/license/before/Licences.java: -------------------------------------------------------------------------------- 1 | package swcs.clean.license.before; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | public final class Licences { 7 | private final Map licences; 8 | 9 | public Licences() { 10 | this.licences = new HashMap<>(); 11 | this.licences.put(new LicenceType("demo-licence"), "XARD-LOKU-CJKF-CLLF-OPLJJ"); 12 | } 13 | 14 | public String get(LicenceType licence) { 15 | return this.licences.get(licence); 16 | } 17 | 18 | public void put(LicenceType licence, String value) { 19 | this.licences.put(licence, value); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /swcs-compression/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 4.0.0 7 | 8 | 9 | swcs 10 | swcs-parent 11 | 0.0.1-SNAPSHOT 12 | 13 | 14 | swcs-compression 15 | swcs-compression 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /swcs-compression/src/main/java/swcs/converter/after/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.converter.after; 2 | 3 | import java.io.File; 4 | 5 | class Client { 6 | 7 | public static void main(String[] args) { 8 | Converter converter = new Converter(new File("picture.tiff")); 9 | File converted = converter.convert(CompressionType.JPG); 10 | // ... 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-compression/src/main/java/swcs/converter/after/Compression.java: -------------------------------------------------------------------------------- 1 | package swcs.converter.after; 2 | 3 | import java.io.File; 4 | 5 | @FunctionalInterface 6 | interface Compression { 7 | 8 | File compress(File source); 9 | 10 | } 11 | -------------------------------------------------------------------------------- /swcs-compression/src/main/java/swcs/converter/after/CompressionType.java: -------------------------------------------------------------------------------- 1 | package swcs.converter.after; 2 | 3 | public enum CompressionType { 4 | JPG, PNG 5 | } 6 | -------------------------------------------------------------------------------- /swcs-compression/src/main/java/swcs/converter/after/Converter.java: -------------------------------------------------------------------------------- 1 | package swcs.converter.after; 2 | 3 | import java.io.File; 4 | import java.util.Objects; 5 | 6 | public class Converter { 7 | 8 | private final File source; 9 | 10 | public Converter(File source) { 11 | this.source = Objects.requireNonNull(source); 12 | } 13 | 14 | public File convert(CompressionType type) { 15 | Objects.requireNonNull(type); 16 | 17 | System.out.println("Compression: convert started."); 18 | 19 | Compression compression = CompressionFactory.from(type); 20 | File converted = compression.compress(this.source); 21 | 22 | System.out.println("Compression: convert completed."); 23 | 24 | return converted; 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /swcs-compression/src/main/java/swcs/converter/after/JpgCompression.java: -------------------------------------------------------------------------------- 1 | package swcs.converter.after; 2 | 3 | import java.io.File; 4 | 5 | final class JpgCompression implements Compression { 6 | 7 | @Override 8 | public File compress(File source) { 9 | File compressedFile = null; 10 | // do compression on file; 11 | 12 | return compressedFile; 13 | } 14 | } -------------------------------------------------------------------------------- /swcs-compression/src/main/java/swcs/converter/after/PngCompression.java: -------------------------------------------------------------------------------- 1 | package swcs.converter.after; 2 | 3 | import java.io.File; 4 | 5 | final class PngCompression implements Compression { 6 | 7 | @Override 8 | public File compress(File source) { 9 | File compressedFile = null; 10 | // do compression on file; 11 | 12 | return compressedFile; 13 | } 14 | } -------------------------------------------------------------------------------- /swcs-compression/src/main/java/swcs/converter/before/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.converter.before; 2 | 3 | import java.io.File; 4 | 5 | class Client { 6 | 7 | public static void main(String[] args) { 8 | File file = Converter.convert("jpg", new File("picture.tiff")); 9 | // ... 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /swcs-dp/.gitignore: -------------------------------------------------------------------------------- 1 | /bin/ 2 | -------------------------------------------------------------------------------- /swcs-dp/README.md: -------------------------------------------------------------------------------- 1 | ## SOLID Design Principles 2 | 3 | * [Single Responsibility Principle (SRP)][1] 4 | * [Open Closed Principle (OCP)][2] 5 | * [Liskov Substitution Principle (LSP)][3] 6 | * [Interface Segregation Principle (ISP)][4] 7 | * [Dependency Inversion Principle (DIP)][5] 8 | 9 | [1]: src/main/java/swcs/dp/srp 10 | [2]: src/main/java/swcs/dp/ocp 11 | [3]: src/main/java/swcs/dp/lsp 12 | [4]: src/main/java/swcs/dp/isp 13 | [5]: src/main/java/swcs/dp/dip 14 | -------------------------------------------------------------------------------- /swcs-dp/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 4.0.0 7 | 8 | 9 | swcs 10 | swcs-parent 11 | 0.0.1-SNAPSHOT 12 | 13 | 14 | swcs-dp 15 | swcs-dp 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/adp/after/p1/A.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.adp.after.p1; 2 | 3 | import swcs.dp.adp.after.p2.B; 4 | 5 | public class A { 6 | 7 | private final B b; 8 | 9 | public A(B b) { 10 | this.b = b; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/adp/after/p1/CImpl.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.adp.after.p1; 2 | 3 | import swcs.dp.adp.after.p3.C; 4 | 5 | public class CImpl implements C { 6 | 7 | private final A a; 8 | 9 | public CImpl(A a) { 10 | this.a = a; 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/adp/after/p2/B.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.adp.after.p2; 2 | 3 | import swcs.dp.adp.after.p3.C; 4 | 5 | public class B { 6 | 7 | private final C c; 8 | 9 | public B(C c) { 10 | this.c = c; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/adp/after/p3/C.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.adp.after.p3; 2 | 3 | public interface C { 4 | 5 | } -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/adp/before/p1/A.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.adp.before.p1; 2 | 3 | import swcs.dp.adp.before.p2.B; 4 | 5 | public class A { 6 | 7 | private final B b; 8 | 9 | public A(B b) { 10 | this.b = b; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/adp/before/p2/B.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.adp.before.p2; 2 | 3 | import swcs.dp.adp.before.p3.C; 4 | 5 | public class B { 6 | 7 | private final C c; 8 | 9 | public B(C c) { 10 | this.c = c; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/adp/before/p3/C.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.adp.before.p3; 2 | 3 | import swcs.dp.adp.before.p1.A; 4 | 5 | public class C { 6 | 7 | private final A a; 8 | 9 | public C(A a) { 10 | this.a = a; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/dip/logger/after/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.dip.logger.after; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | Logger fsLogger = new Logger(new FileSystem()); 7 | Logger dbLogger = new Logger(new Database()); 8 | 9 | fsLogger.log("some text"); 10 | dbLogger.log("other text"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/dip/logger/after/Database.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.dip.logger.after; 2 | 3 | class Database implements Loggable { 4 | 5 | @Override 6 | public void log(String message) { 7 | // writing in database 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/dip/logger/after/FileSystem.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.dip.logger.after; 2 | 3 | class FileSystem implements Loggable { 4 | 5 | @Override 6 | public void log(String message) { 7 | // file handling and writing 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/dip/logger/after/Loggable.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.dip.logger.after; 2 | 3 | public interface Loggable { 4 | void log(String message); 5 | } 6 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/dip/logger/after/Logger.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.dip.logger.after; 2 | 3 | class Logger { 4 | private final Loggable loggable; 5 | 6 | Logger(Loggable loggable) { 7 | this.loggable = loggable; 8 | } 9 | 10 | public void log(String message) { 11 | this.loggable.log(message); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/dip/logger/before/FileSystem.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.dip.logger.before; 2 | 3 | class FileSystem { 4 | 5 | public void log(String message) { 6 | // file handling and writing 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/dip/logger/before/Logger.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.dip.logger.before; 2 | 3 | class Logger { 4 | private final FileSystem fileSystem; 5 | 6 | Logger() { 7 | this.fileSystem = new FileSystem(); 8 | } 9 | 10 | public void log(String message) { 11 | this.fileSystem.log(message); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/dip/userservice/after/UserRepository.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.dip.userservice.after; 2 | 3 | public class UserRepository { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/dip/userservice/after/UserService.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.dip.userservice.after; 2 | 3 | public class UserService { 4 | 5 | private final UserRepository userRepository; 6 | 7 | public UserService(UserRepository userRepository) { 8 | this.userRepository = userRepository; 9 | } 10 | } -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/dip/userservice/before/UserRepository.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.dip.userservice.before; 2 | 3 | public interface UserRepository { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/dip/userservice/before/UserRepositoryHibernate.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.dip.userservice.before; 2 | 3 | public class UserRepositoryHibernate implements UserRepository { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/dip/userservice/before/UserService.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.dip.userservice.before; 2 | 3 | public class UserService { 4 | 5 | private final UserRepository userRepository; 6 | 7 | public UserService() { 8 | this.userRepository = new UserRepositoryHibernate(); 9 | } 10 | } -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/printer/after/AllInOnePrinter.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.printer.after; 2 | 3 | class AllInOnePrinter implements Printer, Fax, Scanner { 4 | 5 | @Override 6 | public void print() { 7 | } 8 | 9 | @Override 10 | public void fax() { 11 | } 12 | 13 | @Override 14 | public void scan() { 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/printer/after/Fax.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.printer.after; 2 | 3 | public interface Fax { 4 | void fax(); 5 | } 6 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/printer/after/InkjetPrinter.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.printer.after; 2 | 3 | class InkjetPrinter implements Printer { 4 | 5 | @Override 6 | public void print() { 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/printer/after/Printer.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.printer.after; 2 | 3 | public interface Printer { 4 | void print(); 5 | } 6 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/printer/after/Scanner.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.printer.after; 2 | 3 | public interface Scanner { 4 | void scan(); 5 | } 6 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/printer/before/AllInOnePrinter.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.printer.before; 2 | 3 | class AllInOnePrinter implements MultiFunctionDevice { 4 | 5 | @Override 6 | public void print() { 7 | } 8 | 9 | @Override 10 | public void fax() { 11 | } 12 | 13 | @Override 14 | public void scan() { 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/printer/before/InkjetPrinter.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.printer.before; 2 | 3 | class InkjetPrinter implements MultiFunctionDevice { 4 | 5 | @Override 6 | public void print() { 7 | } 8 | 9 | @Override 10 | public void fax() { 11 | throw new UnsupportedOperationException(); 12 | } 13 | 14 | @Override 15 | public void scan() { 16 | throw new UnsupportedOperationException(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/printer/before/MultiFunctionDevice.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.printer.before; 2 | 3 | public interface MultiFunctionDevice { 4 | 5 | void print(); 6 | 7 | void fax(); 8 | 9 | void scan(); 10 | } 11 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/stockorder/after/Price.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.stockorder.after; 2 | 3 | public interface Price { 4 | } 5 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/stockorder/after/StockId.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.stockorder.after; 2 | 3 | public interface StockId { 4 | } 5 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/stockorder/after/StockOrder.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.stockorder.after; 2 | 3 | public interface StockOrder { 4 | 5 | void sell(StockId id, int quantity, Price price); 6 | 7 | void buy(StockId id, int quantity, Price price); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/stockorder/before/StockId.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.stockorder.before; 2 | 3 | public interface StockId { 4 | } 5 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/stockorder/before/StockOrder.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.stockorder.before; 2 | 3 | public interface StockOrder { 4 | 5 | void sell(StockId id, double price, int quantity); 6 | 7 | void buy(StockId id, int quantity, double price); 8 | 9 | void buy(StockId id, int quantity, double price, double commission); 10 | 11 | void buy(StockId id, int quantity, double minPrice, double maxPrice, double commission); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/techemployee/after/Designer.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.techemployee.after; 2 | 3 | public interface Designer { 4 | 5 | void design(); 6 | } 7 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/techemployee/after/Developer.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.techemployee.after; 2 | 3 | public interface Developer { 4 | 5 | void develop(); 6 | } 7 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/techemployee/after/JavaDeveloper.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.techemployee.after; 2 | 3 | public class JavaDeveloper implements Developer { 4 | 5 | @Override 6 | public void develop() { 7 | System.out.println("Yes, I love it!"); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/techemployee/after/SecurityTester.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.techemployee.after; 2 | 3 | public class SecurityTester implements Tester { 4 | 5 | @Override 6 | public void test() { 7 | System.out.println("Yes, I love it!"); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/techemployee/after/Tester.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.techemployee.after; 2 | 3 | public interface Tester { 4 | 5 | void test(); 6 | } 7 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/techemployee/after/UIDesigner.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.techemployee.after; 2 | 3 | public class UIDesigner implements Designer { 4 | 5 | @Override 6 | public void design() { 7 | System.out.println("Yes, I love it!"); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/techemployee/before/Designer.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.techemployee.before; 2 | 3 | public class Designer implements TechEmployee { 4 | 5 | @Override 6 | public void develop() { 7 | throw new UnsupportedOperationException(); 8 | } 9 | 10 | @Override 11 | public void test() { 12 | throw new UnsupportedOperationException(); 13 | } 14 | 15 | @Override 16 | public void design() { 17 | System.out.println("Yes, I love it!"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/techemployee/before/JavaDeveloper.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.techemployee.before; 2 | 3 | public class JavaDeveloper implements TechEmployee { 4 | 5 | @Override 6 | public void develop() { 7 | System.out.println("Yes, I love it!"); 8 | } 9 | 10 | @Override 11 | public void test() { 12 | throw new UnsupportedOperationException(); 13 | } 14 | 15 | @Override 16 | public void design() { 17 | throw new UnsupportedOperationException(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/techemployee/before/TechEmployee.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.techemployee.before; 2 | 3 | public interface TechEmployee { 4 | 5 | void develop(); 6 | 7 | void test(); 8 | 9 | void design(); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/isp/techemployee/before/Tester.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.isp.techemployee.before; 2 | 3 | public class Tester implements TechEmployee { 4 | 5 | @Override 6 | public void develop() { 7 | throw new UnsupportedOperationException(); 8 | } 9 | 10 | @Override 11 | public void test() { 12 | System.out.println("Yes, I love it!"); 13 | } 14 | 15 | @Override 16 | public void design() { 17 | throw new UnsupportedOperationException(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/lsp/bird/after/Bird.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.lsp.bird.after; 2 | 3 | class Bird { 4 | private final String name; 5 | 6 | Bird(String name) { 7 | this.name = name; 8 | } 9 | 10 | public String name() { 11 | return this.name; 12 | } 13 | 14 | public void eat() { 15 | System.out.println(this.name + " is eating."); 16 | } 17 | 18 | public void move() { 19 | System.out.println(this.name + " is moving."); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/lsp/bird/after/Penguin.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.lsp.bird.after; 2 | 3 | class Penguin extends Bird { 4 | Penguin(String name) { 5 | super(name); 6 | } 7 | 8 | @Override 9 | public void move() { 10 | System.out.println(name() + " is swimming gracefully."); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/lsp/bird/after/Sparrow.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.lsp.bird.after; 2 | 3 | class Sparrow extends Bird { 4 | Sparrow(String name) { 5 | super(name); 6 | } 7 | 8 | @Override 9 | public void move() { 10 | System.out.println(name() + " is flying."); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/lsp/bird/before/Bird.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.lsp.bird.before; 2 | 3 | class Bird { 4 | private final String name; 5 | 6 | public Bird(String name) { 7 | this.name = name; 8 | } 9 | 10 | public String name() { 11 | return this.name; 12 | } 13 | 14 | public void eat() { 15 | System.out.println(name + " is eating."); 16 | } 17 | 18 | public void fly() { 19 | System.out.println(name + " is flying."); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/lsp/bird/before/Penguin.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.lsp.bird.before; 2 | 3 | class Penguin extends Bird { 4 | public Penguin(String name) { 5 | super(name); 6 | } 7 | 8 | @Override 9 | public void fly() { 10 | throw new UnsupportedOperationException(name() + " can't fly."); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/lsp/bird/before/Sparrow.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.lsp.bird.before; 2 | 3 | class Sparrow extends Bird { 4 | public Sparrow(String name) { 5 | super(name); 6 | } 7 | 8 | @Override 9 | public void eat() { 10 | System.out.println(name() + " is pecking at seeds."); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/lsp/coupon/after/Coupon.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.lsp.coupon.after; 2 | 3 | import java.math.BigDecimal; 4 | 5 | public interface Coupon { 6 | 7 | BigDecimal regularPrice(); 8 | 9 | /** 10 | * Returns a {@code BigDecimal} whose value is {@code (+this)}, 11 | * minus the provided discount. 12 | * 13 | * @param discount the discount to use. 14 | * @return {@code this}, minus the discount. If the discount is 15 | * greater than the regular price {@code BigDecimal.ZERO} will be returned. 16 | * If the discount is {@code null} than this discount will not be subtracted. 17 | */ 18 | BigDecimal afterDiscount(BigDecimal discount); 19 | } -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/lsp/coupon/after/PromotionCoupon.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.lsp.coupon.after; 2 | 3 | import java.math.BigDecimal; 4 | 5 | public final class PromotionCoupon extends RegularCoupon { 6 | 7 | private static final double PERCENTAGE_DISCOUNT = 0.9; 8 | 9 | public PromotionCoupon(BigDecimal regularPrice) { 10 | super(regularPrice); 11 | } 12 | 13 | @Override 14 | public BigDecimal afterDiscount(BigDecimal discount) { 15 | return super.afterDiscount(discount) 16 | .multiply(BigDecimal.valueOf(PERCENTAGE_DISCOUNT)); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/lsp/coupon/before/Coupon.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.lsp.coupon.before; 2 | 3 | import java.math.BigDecimal; 4 | 5 | public class Coupon { 6 | 7 | private final BigDecimal regularPrice; 8 | 9 | public Coupon(BigDecimal regularPrice) { 10 | this.regularPrice = regularPrice; 11 | } 12 | 13 | public BigDecimal regularPrice() { 14 | return this.regularPrice; 15 | } 16 | 17 | public BigDecimal afterDiscount(BigDecimal discount) { 18 | if (discount == null) { 19 | return this.regularPrice; 20 | } 21 | 22 | if (this.regularPrice.compareTo(discount) > 0) { 23 | return this.regularPrice.subtract(discount); 24 | } 25 | 26 | return BigDecimal.ZERO; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/lsp/coupon/before/PromotionCoupon.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.lsp.coupon.before; 2 | 3 | import java.math.BigDecimal; 4 | 5 | public class PromotionCoupon extends Coupon { 6 | 7 | private static final double PERCENTAGE_DISCOUNT = 0.9; 8 | 9 | public PromotionCoupon(BigDecimal regularPrice) { 10 | super(regularPrice); 11 | } 12 | 13 | @Override 14 | public BigDecimal afterDiscount(BigDecimal discount) { 15 | // strengthened pre-conditions and no check for null 16 | if (regularPrice().compareTo(discount) < 0) { 17 | throw new IllegalArgumentException("Discount can not be greater than the price!"); 18 | } 19 | 20 | return super.afterDiscount(discount) 21 | .multiply(BigDecimal.valueOf(PERCENTAGE_DISCOUNT)); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/lsp/figure/after/Circle.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.lsp.figure.after; 2 | 3 | public class Circle implements Figure { 4 | 5 | private final double radius; 6 | 7 | public Circle(double radius) { 8 | this.radius = radius; 9 | } 10 | 11 | @Override 12 | public double area() { 13 | return Math.PI * (this.radius * this.radius); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/lsp/figure/after/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.lsp.figure.after; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | testArea(new Rectangle(4, 5)); 7 | testArea(new Square(5)); 8 | } 9 | 10 | public static void testArea(Rectangle rectangle) { 11 | if (rectangle.area() != 20) { 12 | throw new IllegalStateException("Error in area calculation!"); 13 | } 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/lsp/figure/after/Figure.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.lsp.figure.after; 2 | 3 | public interface Figure { 4 | 5 | double area(); 6 | } 7 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/lsp/figure/after/Rectangle.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.lsp.figure.after; 2 | 3 | public class Rectangle implements Figure { 4 | 5 | private final double length; 6 | private final double width; 7 | 8 | public Rectangle(double length, double width) { 9 | this.length = length; 10 | this.width = width; 11 | } 12 | 13 | @Override 14 | public double area() { 15 | return this.length * this.width; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/lsp/figure/after/Square.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.lsp.figure.after; 2 | 3 | public class Square extends Rectangle { 4 | 5 | public Square(double side) { 6 | super(side, side); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/lsp/figure/before/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.lsp.figure.before; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | testArea(new Rectangle()); 7 | testArea(new Square()); 8 | } 9 | 10 | public static void testArea(Rectangle rectangle) { 11 | rectangle.width(5); 12 | rectangle.height(4); 13 | 14 | if (rectangle.area() != 20) { 15 | throw new IllegalStateException("Error in area calculation!"); 16 | } 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/lsp/figure/before/Rectangle.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.lsp.figure.before; 2 | 3 | public class Rectangle { 4 | 5 | private double height; 6 | private double width; 7 | 8 | public double height() { 9 | return this.height; 10 | } 11 | 12 | public double width() { 13 | return this.width; 14 | } 15 | 16 | public void height(double height) { 17 | this.height = height; 18 | } 19 | 20 | public void width(double width) { 21 | this.width = width; 22 | } 23 | 24 | public double area() { 25 | return this.width * this.height; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/lsp/figure/before/Square.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.lsp.figure.before; 2 | 3 | public class Square extends Rectangle { 4 | 5 | @Override 6 | public double area() { 7 | return this.height() * this.height(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/calculator/after/Calculator.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.calculator.after; 2 | 3 | public class Calculator { 4 | 5 | public double calculate(double x, double y, Operation operation) { 6 | return operation.apply(x, y); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/calculator/after/Operation.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.calculator.after; 2 | 3 | import java.util.function.DoubleBinaryOperator; 4 | 5 | public enum Operation { 6 | 7 | PLUS((x, y) -> x + y), 8 | MINUS((x, y) -> x - y), 9 | MULTIPLY((x, y) -> x * y), 10 | DIVIDE((x, y) -> x / y); 11 | 12 | private final DoubleBinaryOperator operator; 13 | 14 | Operation(DoubleBinaryOperator operator) { 15 | this.operator = operator; 16 | } 17 | 18 | public double apply(double x, double y) { 19 | return this.operator.applyAsDouble(x, y); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/calculator/before/Calculator.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.calculator.before; 2 | 3 | public class Calculator { 4 | 5 | public double calculate(double x, double y, String operator) { 6 | double result; 7 | 8 | if ("plus".equals(operator)) { 9 | result = x + y; 10 | } else if ("minus".equals(operator)) { 11 | result = x - y; 12 | } else if ("multiply".equals(operator)) { 13 | result = x * y; 14 | } else if ("divide".equals(operator)) { 15 | result = x / y; 16 | } else { 17 | throw new IllegalArgumentException(String.format("Operator %s not supported!", operator)); 18 | } 19 | 20 | return result; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/humanresource/after/Developer.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.humanresource.after; 2 | 3 | class Developer implements Employee { 4 | 5 | @Override 6 | public void signContract() { 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/humanresource/after/Employee.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.humanresource.after; 2 | 3 | interface Employee { 4 | 5 | void signContract(); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/humanresource/after/HumanResourceDepartment.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.humanresource.after; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class HumanResourceDepartment { 7 | private final List employees; 8 | 9 | public HumanResourceDepartment() { 10 | this.employees = new ArrayList<>(); 11 | } 12 | 13 | public void hire(Employee employee) { 14 | employee.signContract(); 15 | this.employees.add(employee); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/humanresource/after/Manager.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.humanresource.after; 2 | 3 | class Manager implements Employee { 4 | 5 | @Override 6 | public void signContract() { 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/humanresource/after/Secretary.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.humanresource.after; 2 | 3 | class Secretary implements Employee { 4 | 5 | @Override 6 | public void signContract() { 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/humanresource/before/Developer.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.humanresource.before; 2 | 3 | class Developer { 4 | 5 | public void signContract() { 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/humanresource/before/HumanResourceDepartment.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.humanresource.before; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class HumanResourceDepartment { 7 | 8 | private final List developers; 9 | private final List managers; 10 | 11 | public HumanResourceDepartment() { 12 | this.developers = new ArrayList<>(); 13 | this.managers = new ArrayList<>(); 14 | } 15 | 16 | public void hire(Developer developer) { 17 | developer.signContract(); 18 | this.developers.add(developer); 19 | } 20 | 21 | public void hire(Manager manager) { 22 | manager.signContract(); 23 | this.managers.add(manager); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/humanresource/before/Manager.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.humanresource.before; 2 | 3 | class Manager { 4 | 5 | public void signContract() { 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/loanvalidator/after/BusinessLoanValidator.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.loanvalidator.after; 2 | 3 | public class BusinessLoanValidator implements Validator { 4 | @Override 5 | public boolean isValid(int balance) { 6 | return balance > 5000; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/loanvalidator/after/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.loanvalidator.after; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | LoanRequestHandler loanRequestHandler = new LoanRequestHandler(1001, 1); 7 | 8 | loanRequestHandler.approveLoan(new PersonalLoanValidator()); 9 | loanRequestHandler.approveLoan(new BusinessLoanValidator()); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/loanvalidator/after/LoanRequestHandler.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.loanvalidator.after; 2 | 3 | public class LoanRequestHandler { 4 | private final int balance; 5 | private final int period; 6 | 7 | public LoanRequestHandler(int balance, int period) { 8 | this.balance = balance; 9 | this.period = period; 10 | } 11 | 12 | public void approveLoan(Validator validator) { 13 | if (validator.isValid(this.balance)) { 14 | System.out.println("Loan approved..."); 15 | } else { 16 | System.out.println("Sorry not enough balance..."); 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/loanvalidator/after/PersonalLoanValidator.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.loanvalidator.after; 2 | 3 | public class PersonalLoanValidator implements Validator { 4 | @Override 5 | public boolean isValid(int balance) { 6 | return balance > 1000; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/loanvalidator/after/Validator.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.loanvalidator.after; 2 | 3 | public interface Validator { 4 | boolean isValid(int balance); 5 | } 6 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/loanvalidator/before/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.loanvalidator.before; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | LoanRequestHandler loanRequestHandler = new LoanRequestHandler(1001, 1); 7 | loanRequestHandler.approveLoan(new PersonalLoanValidator()); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/loanvalidator/before/LoanRequestHandler.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.loanvalidator.before; 2 | 3 | public class LoanRequestHandler { 4 | private final int balance; 5 | private final int period; 6 | 7 | public LoanRequestHandler(int balance, int period) { 8 | this.balance = balance; 9 | this.period = period; 10 | } 11 | 12 | public void approveLoan(PersonalLoanValidator validator) { 13 | if (validator.isValid(this.balance)) { 14 | System.out.println("Loan approved..."); 15 | } else { 16 | System.out.println("Sorry not enough balance..."); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/loanvalidator/before/PersonalLoanValidator.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.loanvalidator.before; 2 | 3 | public final class PersonalLoanValidator { 4 | 5 | public boolean isValid(int balance) { 6 | return balance > 1000; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/parser/after/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.parser.after; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | FileParser parser = FileParserFactory.newInstance("xml"); 7 | System.out.println(parser.parse("test.xml")); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/parser/after/FileParser.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.parser.after; 2 | 3 | public interface FileParser { 4 | 5 | String parse(String file); 6 | 7 | boolean supports(String extension); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/parser/after/FileParserFactory.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.parser.after; 2 | 3 | import java.util.ServiceLoader; 4 | 5 | public final class FileParserFactory { 6 | 7 | private FileParserFactory() { 8 | } 9 | 10 | public static FileParser newInstance(String extension) { 11 | ServiceLoader loader = ServiceLoader.load(FileParser.class); 12 | 13 | for (FileParser parser : loader) { 14 | if (parser.supports(extension)) { 15 | return parser; 16 | } 17 | } 18 | 19 | return null; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/parser/after/JsonParser.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.parser.after; 2 | 3 | public class JsonParser implements FileParser { 4 | 5 | @Override 6 | public String parse(String file) { 7 | return String.format("Parser %s", JsonParser.class.getSimpleName()); 8 | } 9 | 10 | @Override 11 | public boolean supports(String extension) { 12 | return "json".equalsIgnoreCase(extension); 13 | } 14 | 15 | } -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/parser/after/XmlParser.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.parser.after; 2 | 3 | public class XmlParser implements FileParser { 4 | 5 | @Override 6 | public String parse(String file) { 7 | return String.format("Parser %s", XmlParser.class.getSimpleName()); 8 | } 9 | 10 | @Override 11 | public boolean supports(String extension) { 12 | return "xml".equalsIgnoreCase(extension); 13 | } 14 | 15 | } -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/parser/before/FileParser.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.parser.before; 2 | 3 | public class FileParser { 4 | 5 | public String parse(String filePath) { 6 | if (filePath.indexOf(".xml") > 1) { 7 | return parseXML(filePath); 8 | } else if (filePath.indexOf(".json") > 1) { 9 | return parseJson(filePath); 10 | } 11 | 12 | return null; 13 | } 14 | 15 | private String parseXML(String filePath) { 16 | // logic 17 | return null; 18 | } 19 | 20 | private String parseJson(String filePath) { 21 | // logic 22 | return null; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/shape/after/Circle.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.shape.after; 2 | 3 | public class Circle implements Shape { 4 | @Override 5 | public void draw() { 6 | } 7 | } -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/shape/after/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.shape.after; 2 | 3 | class Client { 4 | public void draw(Shape[] shapes) { 5 | for (Shape shape : shapes) { 6 | shape.draw(); 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/shape/after/Shape.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.shape.after; 2 | 3 | public interface Shape { 4 | void draw(); 5 | } -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/shape/after/Square.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.shape.after; 2 | 3 | public class Square implements Shape { 4 | @Override 5 | public void draw() { 6 | } 7 | } -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/shape/before/Circle.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.shape.before; 2 | 3 | public class Circle implements Shape { 4 | 5 | @Override 6 | public int type() { 7 | return Shape.CIRCLE; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/shape/before/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.shape.before; 2 | 3 | class Client { 4 | 5 | public void draw(Shape[] shapes) { 6 | for (Shape shape : shapes) { 7 | switch (shape.type()) { 8 | case Shape.SQUARE -> draw((Square) shape); 9 | case Shape.CIRCLE -> draw((Circle) shape); 10 | } 11 | } 12 | } 13 | 14 | private void draw(Circle circle) { 15 | // logic for circle 16 | } 17 | 18 | private void draw(Square square) { 19 | // logic for square 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/shape/before/Shape.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.shape.before; 2 | 3 | public interface Shape { 4 | 5 | int SQUARE = 0; 6 | int CIRCLE = 1; 7 | 8 | int type(); 9 | 10 | } 11 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/ocp/shape/before/Square.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.ocp.shape.before; 2 | 3 | public class Square implements Shape { 4 | 5 | @Override 6 | public int type() { 7 | return Shape.SQUARE; 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/srp/book/after/Book.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.srp.book.after; 2 | 3 | public record Book(String title, String author, String content) { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/srp/book/after/BookExporter.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.srp.book.after; 2 | 3 | public interface BookExporter { 4 | void export(Book book); 5 | } 6 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/srp/book/after/EpubExporter.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.srp.book.after; 2 | 3 | public final class EpubExporter implements BookExporter { 4 | 5 | @Override 6 | public void export(Book book) { 7 | // logic 8 | } 9 | } -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/srp/book/after/PdfExporter.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.srp.book.after; 2 | 3 | public final class PdfExporter implements BookExporter { 4 | 5 | @Override 6 | public void export(Book book) { 7 | // logic 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/srp/book/before/Book.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.srp.book.before; 2 | 3 | public record Book(String title, String author, String content) { 4 | 5 | public void exportToPdf() { 6 | // logic 7 | } 8 | 9 | public void exportToEpub() { 10 | // logic 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/srp/modem/after/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.srp.modem.after; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | Modem modem = new Modem(); 7 | 8 | subsystemConnection(modem); 9 | subsystemDataChannel(modem); 10 | } 11 | 12 | private static void subsystemConnection(Connection connection) { 13 | // Only Connection methods visible 14 | connection.hangup(); 15 | } 16 | 17 | private static void subsystemDataChannel(DataChannel channel) { 18 | // Only DataChannel methods visible 19 | channel.receive(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/srp/modem/after/Connection.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.srp.modem.after; 2 | 3 | public interface Connection { 4 | 5 | void dial(String phoneNumber); 6 | 7 | void hangup(); 8 | } 9 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/srp/modem/after/DataChannel.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.srp.modem.after; 2 | 3 | public interface DataChannel { 4 | 5 | void send(char c); 6 | 7 | char receive(); 8 | } 9 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/srp/modem/after/Modem.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.srp.modem.after; 2 | 3 | public final class Modem implements Connection, DataChannel { 4 | 5 | @Override 6 | public void dial(String phoneNumber) { 7 | // logic 8 | } 9 | 10 | @Override 11 | public void hangup() { 12 | // logic 13 | } 14 | 15 | @Override 16 | public void send(char c) { 17 | // logic 18 | } 19 | 20 | @Override 21 | public char receive() { 22 | // logic 23 | return 'L'; // dummy return 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/srp/modem/before/Modem.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.srp.modem.before; 2 | 3 | public interface Modem { 4 | 5 | // Connection management responsibilities 6 | void dial(String phoneNumber); 7 | 8 | void hangup(); 9 | 10 | // Data management responsibilities 11 | void send(char c); 12 | 13 | char receive(); 14 | } 15 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/srp/product/after/DiscountCalculator.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.srp.product.after; 2 | 3 | class DiscountCalculator { 4 | public double calculateDiscount(Product product) { 5 | // Calculate the discount for the product. 6 | return 0.0; 7 | } 8 | } -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/srp/product/after/Product.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.srp.product.after; 2 | 3 | record Product(String name, double price) { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-dp/src/main/java/swcs/dp/srp/product/before/Product.java: -------------------------------------------------------------------------------- 1 | package swcs.dp.srp.product.before; 2 | 3 | record Product(String name, double price) { 4 | 5 | public double calculateDiscount() { 6 | // Calculate the discount for the product. 7 | return 0.0; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /swcs-dp/src/main/resources/META-INF/services/swcs.dp.ocp.parser.after.FileParser: -------------------------------------------------------------------------------- 1 | swcs.dp.ocp.parser.after.JsonParser 2 | swcs.dp.ocp.parser.after.XmlParser -------------------------------------------------------------------------------- /swcs-gof/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | 8 | swcs-parent 9 | 0.0.1-SNAPSHOT 10 | swcs 11 | 12 | 13 | swcs-gof 14 | swcs-gof 15 | jar 16 | 17 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/chainofresponsibility/authentication/AbstractAuthenticationFilter.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.chainofresponsibility.authentication; 2 | 3 | public abstract class AbstractAuthenticationFilter implements AuthenticationFilter { 4 | 5 | private AuthenticationFilter nextFilter; 6 | 7 | @Override 8 | public void setNextFilter(AuthenticationFilter nextFilter) { 9 | this.nextFilter = nextFilter; 10 | } 11 | 12 | public boolean nextFilter(Authentication authentication) { 13 | if (this.nextFilter != null) { 14 | return this.nextFilter.isAuthenticated(authentication); 15 | } 16 | 17 | return false; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/chainofresponsibility/authentication/Authentication.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.chainofresponsibility.authentication; 2 | 3 | public interface Authentication { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/chainofresponsibility/authentication/AuthenticationFilter.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.chainofresponsibility.authentication; 2 | 3 | public interface AuthenticationFilter { 4 | 5 | boolean isAuthenticated(Authentication authentication); 6 | 7 | void setNextFilter(AuthenticationFilter nextFilter); 8 | 9 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/chainofresponsibility/authentication/BasicAuthentication.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.chainofresponsibility.authentication; 2 | 3 | public class BasicAuthentication implements Authentication { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/chainofresponsibility/authentication/BasicAuthenticationFilter.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.chainofresponsibility.authentication; 2 | 3 | public class BasicAuthenticationFilter extends AbstractAuthenticationFilter { 4 | 5 | @Override 6 | public boolean isAuthenticated(Authentication authentication) { 7 | if (authentication instanceof BasicAuthentication) { 8 | // logic 9 | return true; 10 | } 11 | 12 | return nextFilter(authentication); 13 | } 14 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/chainofresponsibility/authentication/BearerAuthentication.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.chainofresponsibility.authentication; 2 | 3 | public class BearerAuthentication implements Authentication { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/chainofresponsibility/authentication/BearerAuthenticationFilter.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.chainofresponsibility.authentication; 2 | 3 | public class BearerAuthenticationFilter extends AbstractAuthenticationFilter { 4 | 5 | @Override 6 | public boolean isAuthenticated(Authentication authentication) { 7 | if (authentication instanceof BearerAuthentication) { 8 | // logic 9 | return true; 10 | } 11 | 12 | return nextFilter(authentication); 13 | } 14 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/chainofresponsibility/authentication/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.chainofresponsibility.authentication; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | AuthenticationFilter digestFilter = new DigestAuthenticationFilter(); 7 | AuthenticationFilter bearerFilter = new BearerAuthenticationFilter(); 8 | AuthenticationFilter basicFilter = new BasicAuthenticationFilter(); 9 | 10 | digestFilter.setNextFilter(bearerFilter); 11 | bearerFilter.setNextFilter(basicFilter); 12 | 13 | System.out.println(digestFilter.isAuthenticated(new BearerAuthentication())); // true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/chainofresponsibility/authentication/DigestAuthentication.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.chainofresponsibility.authentication; 2 | 3 | public class DigestAuthentication implements Authentication { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/chainofresponsibility/authentication/DigestAuthenticationFilter.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.chainofresponsibility.authentication; 2 | 3 | public class DigestAuthenticationFilter extends AbstractAuthenticationFilter { 4 | 5 | @Override 6 | public boolean isAuthenticated(Authentication authentication) { 7 | if (authentication instanceof DigestAuthentication) { 8 | // logic 9 | return true; 10 | } 11 | 12 | return nextFilter(authentication); 13 | } 14 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/chainofresponsibility/purchase/AbstractEmployee.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.chainofresponsibility.purchase; 2 | 3 | public abstract class AbstractEmployee implements Employee { 4 | 5 | private Employee nextEmployee; 6 | 7 | @Override 8 | public void next(Employee nextEmployee) { 9 | this.nextEmployee = nextEmployee; 10 | } 11 | 12 | public Employee next() { 13 | return this.nextEmployee; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/chainofresponsibility/purchase/CTO.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.chainofresponsibility.purchase; 2 | 3 | public class CTO extends AbstractEmployee { 4 | 5 | @Override 6 | public void authorize(Purchase purchase) { 7 | if (purchase.amount() > 100_000d) { 8 | System.out.println("CTO"); 9 | } else { 10 | next().authorize(purchase); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/chainofresponsibility/purchase/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.chainofresponsibility.purchase; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | Employee cto = new CTO(); 7 | Employee vp = new VP(); 8 | Employee teamLead = new TeamLead(); 9 | 10 | teamLead.next(vp); 11 | vp.next(cto); 12 | 13 | teamLead.authorize(new Purchase(100)); // TeamLead 14 | teamLead.authorize(new Purchase(99_999)); // VP 15 | teamLead.authorize(new Purchase(500_000)); // CTO 16 | } 17 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/chainofresponsibility/purchase/Employee.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.chainofresponsibility.purchase; 2 | 3 | public interface Employee extends PurchaseAuthorizeFlow { 4 | 5 | void authorize(Purchase purchase); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/chainofresponsibility/purchase/Purchase.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.chainofresponsibility.purchase; 2 | 3 | public record Purchase(double amount) { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/chainofresponsibility/purchase/PurchaseAuthorizeFlow.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.chainofresponsibility.purchase; 2 | 3 | public interface PurchaseAuthorizeFlow { 4 | 5 | void next(Employee nextEmployee); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/chainofresponsibility/purchase/TeamLead.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.chainofresponsibility.purchase; 2 | 3 | public class TeamLead extends AbstractEmployee { 4 | 5 | @Override 6 | public void authorize(Purchase purchase) { 7 | if (purchase.amount() <= 10_000d) { 8 | System.out.println("TeamLead"); 9 | } else { 10 | next().authorize(purchase); 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/chainofresponsibility/purchase/VP.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.chainofresponsibility.purchase; 2 | 3 | public class VP extends AbstractEmployee { 4 | 5 | @Override 6 | public void authorize(Purchase purchase) { 7 | if (purchase.amount() > 10_000d && purchase.amount() < 100_000d) { 8 | System.out.println("VP"); 9 | } else { 10 | next().authorize(purchase); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/command/filesystem/BatchFileSystemExecutor.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.command.filesystem; 2 | 3 | import java.util.List; 4 | 5 | public class BatchFileSystemExecutor { 6 | 7 | private final FileSystem fs; 8 | 9 | public BatchFileSystemExecutor(FileSystem fs) { 10 | this.fs = fs; 11 | } 12 | 13 | public void execute(List commands) { 14 | commands.forEach(c -> c.execute(this.fs)); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/command/filesystem/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.command.filesystem; 2 | 3 | import java.io.File; 4 | import java.util.List; 5 | 6 | class Client { 7 | 8 | public static void main(String[] args) { 9 | FileSystem fs = new FileSystem(); 10 | BatchFileSystemExecutor executor = new BatchFileSystemExecutor(fs); 11 | 12 | List commands = List.of( 13 | new CreateCommand(new File("file.tmp")), 14 | new DeleteCommand(new File("file.tmp")), 15 | new CreateCommand(new File("secret.txt")), 16 | new MoveCommand(new File("secret.txt"), new File("topsecret.txt"))); 17 | 18 | executor.execute(commands); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/command/filesystem/Command.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.command.filesystem; 2 | 3 | public interface Command { 4 | 5 | void execute(FileSystem fs); 6 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/command/filesystem/CreateCommand.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.command.filesystem; 2 | 3 | import java.io.File; 4 | 5 | public class CreateCommand implements Command { 6 | 7 | private final File file; 8 | 9 | public CreateCommand(File file) { 10 | this.file = file; 11 | } 12 | 13 | @Override 14 | public void execute(FileSystem fs) { 15 | fs.create(this.file); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/command/filesystem/DeleteCommand.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.command.filesystem; 2 | 3 | import java.io.File; 4 | 5 | public class DeleteCommand implements Command { 6 | 7 | private final File file; 8 | 9 | public DeleteCommand(File file) { 10 | this.file = file; 11 | } 12 | 13 | @Override 14 | public void execute(FileSystem fs) { 15 | fs.delete(this.file); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/command/filesystem/FileSystem.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.command.filesystem; 2 | 3 | import java.io.File; 4 | 5 | public class FileSystem { 6 | 7 | public void create(File file) { 8 | System.out.printf("Create %s%n", 9 | file.getName()); 10 | } 11 | 12 | public void delete(File file) { 13 | System.out.printf("Delete %s%n", 14 | file.getName()); 15 | } 16 | 17 | public void move(File source, File target) { 18 | System.out.printf("Move %s to %s%n", 19 | source.getName(), 20 | target.getName()); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/command/filesystem/MoveCommand.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.command.filesystem; 2 | 3 | import java.io.File; 4 | 5 | public class MoveCommand implements Command { 6 | 7 | private final File source; 8 | private final File target; 9 | 10 | public MoveCommand(File source, File target) { 11 | this.source = source; 12 | this.target = target; 13 | } 14 | 15 | @Override 16 | public void execute(FileSystem fs) { 17 | fs.move(this.source, this.target); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/command/television/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.command.television; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | Television television = new Television(); 7 | 8 | DeviceButton power = new DeviceButton(); 9 | DeviceButton volume = new DeviceButton(); 10 | 11 | power.command(new TurnOn(television)); 12 | power.press(); 13 | 14 | volume.command(new VolumeUp(television)); 15 | volume.press(); 16 | volume.press(); 17 | volume.press(); 18 | 19 | volume.command(new VolumeDown(television)); 20 | volume.press(); 21 | 22 | power.command(new TurnOff(television)); 23 | power.press(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/command/television/Command.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.command.television; 2 | 3 | public interface Command { 4 | 5 | void execute(); 6 | } 7 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/command/television/DeviceButton.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.command.television; 2 | 3 | public class DeviceButton { 4 | 5 | private Command command; 6 | 7 | public void command(Command command) { 8 | this.command = command; 9 | } 10 | 11 | public void press() { 12 | this.command.execute(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/command/television/Television.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.command.television; 2 | 3 | public class Television { 4 | 5 | private int volume; 6 | 7 | public void on() { 8 | System.out.println("TV is on"); 9 | } 10 | 11 | public void off() { 12 | System.out.println("TV is off"); 13 | } 14 | 15 | public void volumeUp() { 16 | this.volume++; 17 | 18 | System.out.println("Volume: " + this.volume); 19 | } 20 | 21 | public void volumeDown() { 22 | this.volume--; 23 | 24 | System.out.println("Volume: " + this.volume); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/command/television/TurnOff.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.command.television; 2 | 3 | public class TurnOff implements Command { 4 | 5 | private final Television device; 6 | 7 | public TurnOff(Television device) { 8 | this.device = device; 9 | } 10 | 11 | @Override 12 | public void execute() { 13 | this.device.off(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/command/television/TurnOn.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.command.television; 2 | 3 | public class TurnOn implements Command { 4 | 5 | private final Television device; 6 | 7 | public TurnOn(Television device) { 8 | this.device = device; 9 | } 10 | 11 | @Override 12 | public void execute() { 13 | this.device.on(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/command/television/VolumeDown.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.command.television; 2 | 3 | public class VolumeDown implements Command { 4 | 5 | private final Television device; 6 | 7 | public VolumeDown(Television device) { 8 | this.device = device; 9 | } 10 | 11 | @Override 12 | public void execute() { 13 | this.device.volumeDown(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/command/television/VolumeUp.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.command.television; 2 | 3 | public class VolumeUp implements Command { 4 | 5 | private final Television device; 6 | 7 | public VolumeUp(Television device) { 8 | this.device = device; 9 | } 10 | 11 | @Override 12 | public void execute() { 13 | this.device.volumeUp(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/interpreter/calculator/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.interpreter.calculator; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | Evaluator evaluator = new Evaluator("5 - 3 + 29 - 1"); 7 | 8 | System.out.printf("%s = %s%n", 9 | evaluator.expression(), 10 | evaluator.evaluate()); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/interpreter/calculator/Expression.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.interpreter.calculator; 2 | 3 | interface Expression { 4 | 5 | int interpret(); 6 | } 7 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/interpreter/calculator/Minus.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.interpreter.calculator; 2 | 3 | public final class Minus implements Expression { 4 | 5 | private final Expression left; 6 | private final Expression right; 7 | 8 | public Minus(Expression left, Expression right) { 9 | this.left = left; 10 | this.right = right; 11 | } 12 | 13 | @Override 14 | public int interpret() { 15 | return this.left.interpret() - this.right.interpret(); 16 | } 17 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/interpreter/calculator/Number.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.interpreter.calculator; 2 | 3 | public final class Number implements Expression { 4 | 5 | private final int number; 6 | 7 | public Number(String number) { 8 | this.number = Integer.parseInt(number); 9 | } 10 | 11 | @Override 12 | public int interpret() { 13 | return this.number; 14 | } 15 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/interpreter/calculator/Plus.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.interpreter.calculator; 2 | 3 | public final class Plus implements Expression { 4 | 5 | private final Expression left; 6 | private final Expression right; 7 | 8 | public Plus(Expression left, Expression right) { 9 | this.left = left; 10 | this.right = right; 11 | } 12 | 13 | @Override 14 | public int interpret() { 15 | return this.left.interpret() + this.right.interpret(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/interpreter/hexbinary/Context.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.interpreter.hexbinary; 2 | 3 | import java.util.Objects; 4 | 5 | public final class Context { 6 | 7 | private final String expression; 8 | 9 | public Context(String expression) { 10 | this.expression = Objects.requireNonNull(expression); 11 | } 12 | 13 | public String expression() { 14 | return this.expression; 15 | } 16 | 17 | public boolean isToHex() { 18 | return this.expression.contains("Hexadecimal"); 19 | } 20 | 21 | public boolean isToBinary() { 22 | return this.expression.contains("Binary"); 23 | } 24 | 25 | public int number() { 26 | return Integer.parseInt(this.expression.substring(0, this.expression.indexOf(' '))); 27 | } 28 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/interpreter/hexbinary/Expression.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.interpreter.hexbinary; 2 | 3 | public abstract class Expression { 4 | 5 | private final int value; 6 | 7 | protected Expression(int value) { 8 | this.value = value; 9 | } 10 | 11 | public int value() { 12 | return this.value; 13 | } 14 | 15 | abstract String interpret(Context context); 16 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/interpreter/hexbinary/IntToBinaryExpression.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.interpreter.hexbinary; 2 | 3 | public final class IntToBinaryExpression extends Expression { 4 | 5 | public IntToBinaryExpression(int value) { 6 | super(value); 7 | } 8 | 9 | @Override 10 | public String interpret(Context context) { 11 | return Integer.toBinaryString(value()); 12 | } 13 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/interpreter/hexbinary/IntToHexExpression.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.interpreter.hexbinary; 2 | 3 | public final class IntToHexExpression extends Expression { 4 | 5 | public IntToHexExpression(int value) { 6 | super(value); 7 | } 8 | 9 | @Override 10 | public String interpret(Context context) { 11 | return Integer.toHexString(value()); 12 | } 13 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/iterator/extern/cars/Car.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.iterator.extern.cars; 2 | 3 | public record Car(String name) { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/iterator/extern/cars/CarIterator.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.iterator.extern.cars; 2 | 3 | public class CarIterator implements java.util.Iterator { 4 | 5 | private final Car[] cars; 6 | private int index; 7 | 8 | public CarIterator(Car[] cars) { 9 | this.cars = cars; 10 | } 11 | 12 | @Override 13 | public Car next() { 14 | return this.cars[this.index++]; 15 | } 16 | 17 | @Override 18 | public boolean hasNext() { 19 | return this.index < this.cars.length && this.cars[this.index] != null; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/iterator/extern/cars/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.iterator.extern.cars; 2 | 3 | import java.util.Iterator; 4 | 5 | class Client { 6 | 7 | public static void main(String[] args) { 8 | Car[] cars = new Car[4]; 9 | 10 | cars[0] = new Car("Car 1"); 11 | cars[1] = new Car("Car 2"); 12 | cars[2] = new Car("Car 3"); 13 | cars[3] = new Car("Car 4"); 14 | 15 | Iterator iterator = new CarIterator(cars); 16 | 17 | while (iterator.hasNext()) { 18 | Car car = iterator.next(); 19 | System.out.println(car.name()); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/iterator/intern/cars/Car.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.iterator.intern.cars; 2 | 3 | public record Car(String name) { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/iterator/intern/cars/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.iterator.intern.cars; 2 | 3 | import java.util.List; 4 | 5 | class Client { 6 | 7 | public static void main(String[] args) { 8 | List cars = List.of(new Car("Car 1"), new Car("Car 2"), new Car("Car 3"), new Car("Car 4")); 9 | 10 | cars.forEach(c -> System.out.println(c.name())); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/mediator/aircraft/AircraftColleague.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.mediator.aircraft; 2 | 3 | public interface AircraftColleague { 4 | 5 | void startLanding(); 6 | 7 | void finishLanding(); 8 | } 9 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/mediator/aircraft/AircraftMediator.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.mediator.aircraft; 2 | 3 | public interface AircraftMediator { 4 | 5 | void registerRunway(Runway runway); 6 | 7 | String allotRunway(Aircraft aircraft); 8 | 9 | void releaseRunway(Aircraft aircraft); 10 | } 11 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/mediator/aircraft/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.mediator.aircraft; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | AircraftMediator mediator = new AircraftTrafficControlRoom(); 7 | mediator.registerRunway(new Runway("Runway A")); 8 | 9 | AircraftColleague wrightFlight = new Aircraft(mediator, "Wright Flight"); 10 | AircraftColleague airbusA320 = new Aircraft(mediator, "Airbus A320"); 11 | 12 | wrightFlight.startLanding(); 13 | airbusA320.startLanding(); 14 | wrightFlight.finishLanding(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/mediator/aircraft/Runway.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.mediator.aircraft; 2 | 3 | public record Runway(String name) { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/mediator/chat/AnonymousUser.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.mediator.chat; 2 | 3 | public class AnonymousUser extends User { 4 | 5 | public AnonymousUser(ChatMediator mediator) { 6 | super(mediator, "Anonymous"); 7 | } 8 | 9 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/mediator/chat/Chat.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.mediator.chat; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public final class Chat implements ChatMediator { 7 | 8 | private final List users; 9 | 10 | public Chat() { 11 | this.users = new ArrayList<>(); 12 | } 13 | 14 | @Override 15 | public void addUser(User user) { 16 | this.users.add(user); 17 | } 18 | 19 | @Override 20 | public void sendMessage(User fromUser, String message) { 21 | for (User user : this.users) { 22 | if (user != fromUser) { 23 | user.receive(message); 24 | } 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/mediator/chat/ChatMediator.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.mediator.chat; 2 | 3 | interface ChatMediator { 4 | 5 | void sendMessage(User user, String message); 6 | 7 | void addUser(User user); 8 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/mediator/chat/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.mediator.chat; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | ChatMediator mediator = new Chat(); 7 | User user1 = new LoggedInUser(mediator, "Lia"); 8 | User user2 = new LoggedInUser(mediator, "Timo"); 9 | User user3 = new LoggedInUser(mediator, "Matheo"); 10 | User user4 = new LoggedInUser(mediator, "Luisa"); 11 | User user5 = new AnonymousUser(mediator); 12 | 13 | mediator.addUser(user1); 14 | mediator.addUser(user2); 15 | mediator.addUser(user3); 16 | mediator.addUser(user4); 17 | mediator.addUser(user5); 18 | 19 | user1.send("Hi to everybody!"); 20 | } 21 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/mediator/chat/LoggedInUser.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.mediator.chat; 2 | 3 | public class LoggedInUser extends User { 4 | 5 | public LoggedInUser(ChatMediator mediator, String name) { 6 | super(mediator, name); 7 | } 8 | 9 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/mediator/chat/User.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.mediator.chat; 2 | 3 | public class User { 4 | 5 | private final ChatMediator mediator; 6 | private final String name; 7 | 8 | public User(ChatMediator mediator, String name) { 9 | this.mediator = mediator; 10 | this.name = name; 11 | } 12 | 13 | public ChatMediator mediator() { 14 | return this.mediator; 15 | } 16 | 17 | public String name() { 18 | return this.name; 19 | } 20 | 21 | public void send(String message) { 22 | System.out.println(name() + ": Sending Message=" + message); 23 | mediator().sendMessage(this, message); 24 | } 25 | 26 | public void receive(String message) { 27 | System.out.println(name() + ": Received Message:" + message); 28 | } 29 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/memento/balance/CareTaker.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.memento.balance; 2 | 3 | import java.util.Stack; 4 | 5 | public final class CareTaker { 6 | 7 | private final Stack history; 8 | 9 | public CareTaker() { 10 | this.history = new Stack<>(); 11 | } 12 | 13 | public void push(Memento state) { 14 | this.history.push(state); 15 | } 16 | 17 | public Memento pop() { 18 | return this.history.pop(); 19 | } 20 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/memento/balance/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.memento.balance; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | CareTaker careTaker = new CareTaker(); 7 | Originator originator = new Originator(); 8 | 9 | originator.setBalance(40.11d); 10 | careTaker.push(originator.save()); 11 | System.out.println(originator.getBalance()); 12 | 13 | originator.setBalance(100.11d); 14 | careTaker.push(originator.save()); 15 | System.out.println(originator.getBalance()); 16 | 17 | originator.restore(careTaker.pop()); 18 | System.out.println(originator.getBalance()); 19 | 20 | originator.restore(careTaker.pop()); 21 | System.out.println(originator.getBalance()); 22 | } 23 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/memento/balance/Memento.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.memento.balance; 2 | 3 | public record Memento(Double balance) { 4 | 5 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/memento/balance/Originator.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.memento.balance; 2 | 3 | public final class Originator { 4 | 5 | private Double balance; 6 | 7 | public void setBalance(Double balance) { 8 | this.balance = balance; 9 | } 10 | 11 | public Double getBalance() { 12 | return this.balance; 13 | } 14 | 15 | public Memento save() { 16 | return new Memento(this.balance); 17 | } 18 | 19 | public void restore(Memento memento) { 20 | this.balance = memento.balance(); 21 | } 22 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/memento/editor/CleanCodeEditorState.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.memento.editor; 2 | 3 | public final class CleanCodeEditorState implements EditorState { 4 | 5 | private final String content; 6 | private final int fontSize; 7 | private final String fontName; 8 | 9 | public CleanCodeEditorState(String content, int fontSize, String fontName) { 10 | this.content = content; 11 | this.fontName = fontName; 12 | this.fontSize = fontSize; 13 | } 14 | 15 | @Override 16 | public String getContent() { 17 | return this.content; 18 | } 19 | 20 | @Override 21 | public int getFontSize() { 22 | return this.fontSize; 23 | } 24 | 25 | @Override 26 | public String getFontName() { 27 | return this.fontName; 28 | } 29 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/memento/editor/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.memento.editor; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | Editor editor = new CleanCodeEditor("Java Clean Code", 12, "Courier New"); 7 | editor.save(); 8 | 9 | editor.setContent("Java"); 10 | editor.save(); 11 | 12 | editor.restore(); 13 | System.out.println(((CleanCodeEditor) editor).getContent()); 14 | 15 | editor.restore(); 16 | System.out.println(((CleanCodeEditor) editor).getContent()); 17 | } 18 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/memento/editor/Editor.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.memento.editor; 2 | 3 | public interface Editor { 4 | 5 | void setContent(String content); 6 | 7 | void setFontSize(int fontSize); 8 | 9 | void setFontName(String fontName); 10 | 11 | void save(); 12 | 13 | void restore(); 14 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/memento/editor/EditorState.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.memento.editor; 2 | 3 | public interface EditorState { 4 | 5 | String getContent(); 6 | 7 | int getFontSize(); 8 | 9 | String getFontName(); 10 | 11 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/memento/editor/History.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.memento.editor; 2 | 3 | import java.util.Stack; 4 | 5 | public final class History { 6 | 7 | private final Stack history; 8 | 9 | public History() { 10 | this.history = new Stack<>(); 11 | } 12 | 13 | public void push(EditorState state) { 14 | this.history.push(state); 15 | } 16 | 17 | public EditorState pop() { 18 | return this.history.pop(); 19 | } 20 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/observer/datastore/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.observer.datastore; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | Screen screen = new Screen(); 7 | DataStore dataStore = new DataStore(); 8 | 9 | // register observer 10 | dataStore.addObserver(screen); 11 | dataStore.addObserver(new SecondScreen()); 12 | 13 | // do something with dataStore 14 | dataStore.data("changed"); 15 | 16 | // send a notification 17 | dataStore.notifyObservers(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/observer/datastore/DataStore.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.observer.datastore; 2 | 3 | import java.util.Observable; 4 | 5 | public class DataStore extends Observable { 6 | 7 | private String data; 8 | 9 | public String data() { 10 | return this.data; 11 | } 12 | 13 | public void data(String data) { 14 | this.data = data; 15 | // mark the observable as changed 16 | setChanged(); 17 | } 18 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/observer/datastore/Screen.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.observer.datastore; 2 | 3 | import java.util.Observable; 4 | import java.util.Observer; 5 | 6 | public class Screen implements Observer { 7 | 8 | @Override 9 | public void update(Observable o, Object arg) { 10 | System.out.println("Update on screen with data: " + ((DataStore) o).data()); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/observer/datastore/SecondScreen.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.observer.datastore; 2 | 3 | import java.util.Observable; 4 | import java.util.Observer; 5 | 6 | public class SecondScreen implements Observer { 7 | 8 | @Override 9 | public void update(Observable o, Object arg) { 10 | System.out.println("Update on second screen with data: " + ((DataStore) o).data()); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/observer/influencer/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.observer.influencer; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | Influencer influencer = new Influencer("Java"); 7 | 8 | influencer.register(new Follower("PHP")); 9 | influencer.register(new Follower("QBasic")); 10 | influencer.register(new Follower("TypeScript")); 11 | 12 | influencer.notifyAllObservers("Java rocks!"); 13 | } 14 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/observer/influencer/Follower.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.observer.influencer; 2 | 3 | public class Follower implements Observer { 4 | 5 | private final String follower; 6 | 7 | public Follower(String follower) { 8 | this.follower = follower; 9 | } 10 | 11 | @Override 12 | public void update(Object message) { 13 | System.out.printf("%s received message: %s%n", this.follower, message); 14 | } 15 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/observer/influencer/Observer.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.observer.influencer; 2 | 3 | interface Observer { 4 | void update(Object message); 5 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/observer/influencer/Subject.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.observer.influencer; 2 | 3 | public interface Subject { 4 | 5 | void register(Observer observer); 6 | 7 | void unregister(Observer observer); 8 | 9 | void notifyAllObservers(Object message); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/state/door/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.state.door; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | Door door = new Door(new DoorOpen()); 7 | door.handle(); 8 | door.handle(); 9 | door.handle(); 10 | door.handle(); 11 | door.handle(); 12 | door.handle(); 13 | } 14 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/state/door/Door.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.state.door; 2 | 3 | public class Door { 4 | 5 | private DoorState state; 6 | 7 | public Door(DoorState state) { 8 | this.state = state; 9 | } 10 | 11 | public void handle() { 12 | this.state.handle(this); 13 | } 14 | 15 | public void state(DoorState state) { 16 | this.state = state; 17 | } 18 | 19 | public DoorState state() { 20 | return this.state; 21 | } 22 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/state/door/DoorClosed.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.state.door; 2 | 3 | public class DoorClosed implements DoorState { 4 | 5 | public DoorClosed() { 6 | System.out.println("Door closed"); 7 | } 8 | 9 | @Override 10 | public void handle(Door door) { 11 | door.state(new DoorOpening()); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/state/door/DoorClosing.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.state.door; 2 | 3 | public class DoorClosing implements DoorState { 4 | 5 | public DoorClosing() { 6 | System.out.println("Door closing"); 7 | } 8 | 9 | @Override 10 | public void handle(Door door) { 11 | door.state(new DoorClosed()); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/state/door/DoorOpen.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.state.door; 2 | 3 | public class DoorOpen implements DoorState { 4 | 5 | public DoorOpen() { 6 | System.out.println("Door open"); 7 | } 8 | 9 | @Override 10 | public void handle(Door door) { 11 | door.state(new DoorClosing()); 12 | } 13 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/state/door/DoorOpening.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.state.door; 2 | 3 | public class DoorOpening implements DoorState { 4 | 5 | public DoorOpening() { 6 | System.out.println("Door opening"); 7 | } 8 | 9 | @Override 10 | public void handle(Door door) { 11 | door.state(new DoorOpen()); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/state/door/DoorState.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.state.door; 2 | 3 | public interface DoorState { 4 | void handle(Door door); 5 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/state/mp3player/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.state.mp3player; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | MP3Player player = new MP3Player(new PlayingState()); 7 | player.play(); 8 | player.play(); 9 | player.play(); 10 | player.play(); 11 | player.play(); 12 | player.play(); 13 | } 14 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/state/mp3player/MP3Player.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.state.mp3player; 2 | 3 | public class MP3Player { 4 | 5 | private State state; 6 | 7 | public MP3Player(State state) { 8 | this.state = state; 9 | } 10 | 11 | public void play() { 12 | this.state.pressPlay(this); 13 | } 14 | 15 | public void state(State state) { 16 | this.state = state; 17 | } 18 | 19 | public State state() { 20 | return this.state; 21 | } 22 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/state/mp3player/PlayingState.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.state.mp3player; 2 | 3 | public class PlayingState implements State { 4 | 5 | public PlayingState() { 6 | System.out.println("Play state"); 7 | } 8 | 9 | @Override 10 | public void pressPlay(MP3Player player) { 11 | player.state(new StandByState()); 12 | } 13 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/state/mp3player/StandByState.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.state.mp3player; 2 | 3 | public class StandByState implements State { 4 | 5 | public StandByState() { 6 | System.out.println("Standby state"); 7 | } 8 | 9 | @Override 10 | public void pressPlay(MP3Player player) { 11 | player.state(new PlayingState()); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/state/mp3player/State.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.state.mp3player; 2 | 3 | public interface State { 4 | 5 | void pressPlay(MP3Player player); 6 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/strategy/compression/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.strategy.compression; 2 | 3 | import java.util.ArrayList; 4 | 5 | class Client { 6 | 7 | public static void main(String[] args) { 8 | CompressionContext ctx = new CompressionContext(); 9 | 10 | // we could assume context is already set by preferences 11 | ctx.compressionStrategy(new RarCompressionStrategy()); 12 | 13 | // get a list of files 14 | ctx.createArchive(new ArrayList<>()); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/strategy/compression/CompressionContext.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.strategy.compression; 2 | 3 | import java.io.File; 4 | import java.util.List; 5 | 6 | public class CompressionContext { 7 | private CompressionStrategy strategy; 8 | 9 | // this can be set at runtime by the application preferences 10 | public void compressionStrategy(CompressionStrategy strategy) { 11 | this.strategy = strategy; 12 | } 13 | 14 | // use the strategy 15 | public void createArchive(List files) { 16 | this.strategy.compressFiles(files); 17 | } 18 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/strategy/compression/CompressionStrategy.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.strategy.compression; 2 | 3 | import java.io.File; 4 | import java.util.List; 5 | 6 | public interface CompressionStrategy { 7 | 8 | void compressFiles(List files); 9 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/strategy/compression/RarCompressionStrategy.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.strategy.compression; 2 | 3 | import java.io.File; 4 | import java.util.List; 5 | 6 | public class RarCompressionStrategy implements CompressionStrategy { 7 | 8 | @Override 9 | public void compressFiles(List files) { 10 | // using RAR approach 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/strategy/compression/ZipCompressionStrategy.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.strategy.compression; 2 | 3 | import java.io.File; 4 | import java.util.List; 5 | 6 | public class ZipCompressionStrategy implements CompressionStrategy { 7 | 8 | @Override 9 | public void compressFiles(List files) { 10 | // using ZIP approach 11 | } 12 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/strategy/logformatter/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.strategy.logformatter; 2 | 3 | import java.time.LocalDateTime; 4 | import java.util.List; 5 | 6 | class Client { 7 | 8 | public static void main(String[] args) { 9 | GitConsole console = new GitConsole(new FullLogFormatter()); 10 | 11 | List logs = List.of( 12 | new Log("397c670", "cleancoder", "Clean up", LocalDateTime.now()), 13 | new Log("07aa4d5", "cleancoder", "Fix NPE in Log", LocalDateTime.now())); 14 | 15 | console.printLog(logs); 16 | } 17 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/strategy/logformatter/FullLogFormatter.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.strategy.logformatter; 2 | 3 | public class FullLogFormatter implements LogFormatter { 4 | 5 | @Override 6 | public String format(Log log) { 7 | return String.format("Hash: %s%nAuthor: %s%nMessage: %s%nDate: %s%n", 8 | log.hash(), 9 | log.author(), 10 | log.message(), 11 | log.date()); 12 | } 13 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/strategy/logformatter/GitConsole.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.strategy.logformatter; 2 | 3 | import java.util.List; 4 | 5 | public class GitConsole { 6 | 7 | private final LogFormatter formatter; 8 | 9 | public GitConsole(LogFormatter formatter) { 10 | this.formatter = formatter; 11 | } 12 | 13 | public void printLog(List logs) { 14 | logs.forEach(log -> System.out.println(this.formatter.format(log))); 15 | } 16 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/strategy/logformatter/Log.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.strategy.logformatter; 2 | 3 | import java.time.LocalDateTime; 4 | 5 | public record Log(String hash, String author, String message, LocalDateTime date) { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/strategy/logformatter/LogFormatter.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.strategy.logformatter; 2 | 3 | interface LogFormatter { 4 | 5 | String format(Log log); 6 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/strategy/logformatter/OnelineLogFormatter.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.strategy.logformatter; 2 | 3 | public class OnelineLogFormatter implements LogFormatter { 4 | 5 | @Override 6 | public String format(Log log) { 7 | return String.format("%s %s", 8 | log.hash(), 9 | log.message()); 10 | } 11 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/strategy/logformatter/ShortLogFormatter.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.strategy.logformatter; 2 | 3 | public class ShortLogFormatter implements LogFormatter { 4 | 5 | @Override 6 | public String format(Log log) { 7 | return String.format("Hash: %s%nAuthor: %s%nMessage: %s%n", 8 | log.hash(), 9 | log.author(), 10 | log.message()); 11 | } 12 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/strategy/order/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.strategy.order; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | OrderProcessor processor = new OrderProcessor(new CreditCardPayment()); 7 | processor.processOrder(new Order(1)); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/strategy/order/CreditCardPayment.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.strategy.order; 2 | 3 | public class CreditCardPayment implements PaymentStrategy { 4 | 5 | @Override 6 | public void pay(Order order) { 7 | // Process credit card payment 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/strategy/order/Order.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.strategy.order; 2 | 3 | record Order(int id) { 4 | } 5 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/strategy/order/OrderProcessor.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.strategy.order; 2 | 3 | public class OrderProcessor { 4 | 5 | private final PaymentStrategy paymentStrategy; 6 | 7 | public OrderProcessor(PaymentStrategy paymentStrategy) { 8 | this.paymentStrategy = paymentStrategy; 9 | } 10 | 11 | public void processOrder(Order order) { 12 | this.paymentStrategy.pay(order); 13 | } 14 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/strategy/order/PayPalPayment.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.strategy.order; 2 | 3 | public class PayPalPayment implements PaymentStrategy { 4 | 5 | @Override 6 | public void pay(Order order) { 7 | // Process PayPal payment 8 | } 9 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/strategy/order/PaymentStrategy.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.strategy.order; 2 | 3 | public interface PaymentStrategy { 4 | 5 | void pay(Order order); 6 | 7 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/templatemethod/callbackable/Callbackable.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.templatemethod.callbackable; 2 | 3 | interface Callbackable extends Runnable { 4 | 5 | void beforeRun(); 6 | 7 | void afterRun(); 8 | 9 | void onError(Exception e); 10 | 11 | void onSuccess(); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/templatemethod/callbackable/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.templatemethod.callbackable; 2 | 3 | import java.util.concurrent.ExecutorService; 4 | import java.util.concurrent.Executors; 5 | 6 | class Client { 7 | 8 | public static void main(String[] args) { 9 | ExecutorService executor = Executors.newFixedThreadPool(1); 10 | executor.submit(new DefaultCallbackRunnable()); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/templatemethod/callbackable/DefaultCallbackRunnable.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.templatemethod.callbackable; 2 | 3 | public class DefaultCallbackRunnable extends AbstractCallbackRunnable { 4 | 5 | @Override 6 | public void beforeRun() { 7 | System.out.println("beforeRun()"); 8 | } 9 | 10 | @Override 11 | public void afterRun() { 12 | System.out.println("afterRun()"); 13 | } 14 | 15 | @Override 16 | public void onError(Exception e) { 17 | System.out.println("onError()"); 18 | } 19 | 20 | @Override 21 | public void onSuccess() { 22 | System.out.println("onSuccess()"); 23 | } 24 | 25 | @Override 26 | public void startRun() throws Exception { 27 | System.out.println("startRun()"); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/templatemethod/callbackable/Status.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.templatemethod.callbackable; 2 | 3 | public enum Status { 4 | UNKNOWN, WAITING, RUNNING, COMPLETED, FAILED 5 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/templatemethod/compiler/AndroidCompiler.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.templatemethod.compiler; 2 | 3 | public class AndroidCompiler extends CrossCompiler { 4 | 5 | @Override 6 | protected void collectSource() { 7 | // anything specific to this class 8 | } 9 | 10 | @Override 11 | protected void compileToTarget() { 12 | // android specific compilation 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/templatemethod/compiler/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.templatemethod.compiler; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | CrossCompiler iphone = new IPhoneCompiler(); 7 | iphone.crossCompile(); 8 | 9 | CrossCompiler android = new AndroidCompiler(); 10 | android.crossCompile(); 11 | } 12 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/templatemethod/compiler/CrossCompiler.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.templatemethod.compiler; 2 | 3 | public abstract class CrossCompiler { 4 | 5 | public final void crossCompile() { 6 | collectSource(); 7 | compileToTarget(); 8 | } 9 | 10 | // Template methods 11 | abstract void collectSource(); 12 | 13 | abstract void compileToTarget(); 14 | } 15 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/templatemethod/compiler/IPhoneCompiler.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.templatemethod.compiler; 2 | 3 | public class IPhoneCompiler extends CrossCompiler { 4 | 5 | @Override 6 | protected void collectSource() { 7 | // anything specific to this class 8 | } 9 | 10 | @Override 11 | protected void compileToTarget() { 12 | // iphone specific compilation 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/visitor/figures/AreaVisitor.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.visitor.figures; 2 | 3 | public class AreaVisitor implements Visitor { 4 | 5 | @Override 6 | public Double visit(Square square) { 7 | return square.side() * square.side(); 8 | } 9 | 10 | @Override 11 | public Double visit(Circle circle) { 12 | return Math.PI * circle.radius() * circle.radius(); 13 | } 14 | 15 | @Override 16 | public Double visit(Rectangle rectangle) { 17 | return rectangle.height() * rectangle.weight(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/visitor/figures/Circle.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.visitor.figures; 2 | 3 | public class Circle implements Figure { 4 | 5 | private final double radius; 6 | 7 | public Circle(double radius) { 8 | this.radius = radius; 9 | } 10 | 11 | public double radius() { 12 | return this.radius; 13 | } 14 | 15 | @Override 16 | public T accept(Visitor visitor) { 17 | return visitor.visit(this); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/visitor/figures/Figure.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.visitor.figures; 2 | 3 | interface Figure { 4 | T accept(Visitor visitor); 5 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/visitor/figures/PerimeterVisitor.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.visitor.figures; 2 | 3 | public class PerimeterVisitor implements Visitor { 4 | 5 | @Override 6 | public Double visit(Square element) { 7 | return 4 * element.side(); 8 | } 9 | 10 | @Override 11 | public Double visit(Circle element) { 12 | return 2 * Math.PI * element.radius(); 13 | } 14 | 15 | @Override 16 | public Double visit(Rectangle element) { 17 | return 2 * element.height() + 2 * element.height(); 18 | } 19 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/visitor/figures/Rectangle.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.visitor.figures; 2 | 3 | public class Rectangle implements Figure { 4 | 5 | private final double weight; 6 | private final double height; 7 | 8 | public Rectangle(double weight, double height) { 9 | this.weight = weight; 10 | this.height = height; 11 | } 12 | 13 | public double weight() { 14 | return this.weight; 15 | } 16 | 17 | public double height() { 18 | return this.height; 19 | } 20 | 21 | @Override 22 | public T accept(Visitor visitor) { 23 | return visitor.visit(this); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/visitor/figures/Square.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.visitor.figures; 2 | 3 | public class Square implements Figure { 4 | 5 | private final double side; 6 | 7 | public Square(double side) { 8 | this.side = side; 9 | } 10 | 11 | public double side() { 12 | return this.side; 13 | } 14 | 15 | @Override 16 | public T accept(Visitor visitor) { 17 | return visitor.visit(this); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/visitor/figures/Visitor.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.visitor.figures; 2 | 3 | interface Visitor { 4 | 5 | T visit(Square square); 6 | 7 | T visit(Circle circle); 8 | 9 | T visit(Rectangle rectangle); 10 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/visitor/fridge/Beer.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.visitor.fridge; 2 | 3 | import java.time.LocalDate; 4 | 5 | public class Beer implements FridgeElement { 6 | 7 | @Override 8 | public void accept(Visitor visitor) { 9 | visitor.visit(this); 10 | } 11 | 12 | LocalDate bestBeforeDate() { 13 | return LocalDate.of(2022, 1, 28); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/visitor/fridge/Butter.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.visitor.fridge; 2 | 3 | import java.time.LocalDate; 4 | 5 | public class Butter implements FridgeElement { 6 | 7 | @Override 8 | public void accept(Visitor visitor) { 9 | visitor.visit(this); 10 | } 11 | 12 | LocalDate expiryDate() { 13 | return LocalDate.of(2021, 10, 2); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/visitor/fridge/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.visitor.fridge; 2 | 3 | import java.time.LocalDate; 4 | import java.util.List; 5 | 6 | class Client { 7 | 8 | public static void main(String[] args) { 9 | List fridge = List.of( 10 | new Beer(), 11 | new Beer(), 12 | new Milk(), 13 | new Butter()); 14 | 15 | Visitor visitor = new BestBeforeDateVisitor(LocalDate.of(2021, 1, 1)); 16 | 17 | System.out.println("Over the best before date:"); 18 | 19 | for (FridgeElement element : fridge) { 20 | element.accept(visitor); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/visitor/fridge/FridgeElement.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.visitor.fridge; 2 | 3 | public interface FridgeElement { 4 | 5 | void accept(Visitor visitor); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/visitor/fridge/Milk.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.visitor.fridge; 2 | 3 | import java.util.Calendar; 4 | import java.util.Date; 5 | 6 | public class Milk implements FridgeElement { 7 | 8 | @Override 9 | public void accept(Visitor visitor) { 10 | visitor.visit(this); 11 | } 12 | 13 | Date bestBeforeDate() { 14 | return new Date(2021 - 1900, Calendar.JANUARY, 1); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/behavioral/visitor/fridge/Visitor.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.behavioral.visitor.fridge; 2 | 3 | public interface Visitor { 4 | 5 | void visit(Beer beer); 6 | 7 | void visit(Milk milk); 8 | 9 | void visit(Butter butter); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/abstractfactory/car/Car.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.abstractfactory.car; 2 | 3 | public interface Car { 4 | 5 | String name(); 6 | 7 | String features(); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/abstractfactory/car/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.abstractfactory.car; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | VehicleFactory factory = VehicleFactory.vehicleFactory(VehicleFactory.NON_LUXURY_VEHICLE); 7 | 8 | Car car = factory.car(); 9 | System.out.println("Name: " + car.name() + " Features: " + car.features()); 10 | 11 | SUV suv = factory.suv(); 12 | System.out.println("Name: " + suv.name() + " Features: " + suv.features()); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/abstractfactory/car/LuxuryCar.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.abstractfactory.car; 2 | 3 | public class LuxuryCar implements Car { 4 | 5 | private final String name; 6 | 7 | public LuxuryCar(String name) { 8 | this.name = name; 9 | } 10 | 11 | @Override 12 | public String name() { 13 | return this.name; 14 | } 15 | 16 | @Override 17 | public String features() { 18 | return "Luxury Car Features "; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/abstractfactory/car/LuxurySUV.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.abstractfactory.car; 2 | 3 | public class LuxurySUV implements SUV { 4 | 5 | private final String name; 6 | 7 | public LuxurySUV(String name) { 8 | this.name = name; 9 | } 10 | 11 | @Override 12 | public String name() { 13 | return this.name; 14 | } 15 | 16 | @Override 17 | public String features() { 18 | return "Luxury SUV Features "; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/abstractfactory/car/LuxuryVehicleFactory.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.abstractfactory.car; 2 | 3 | public class LuxuryVehicleFactory extends VehicleFactory { 4 | 5 | @Override 6 | public Car car() { 7 | return new LuxuryCar("L-C"); 8 | } 9 | 10 | @Override 11 | public SUV suv() { 12 | return new LuxurySUV("L-S"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/abstractfactory/car/NonLuxuryCar.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.abstractfactory.car; 2 | 3 | public class NonLuxuryCar implements Car { 4 | 5 | private final String name; 6 | 7 | public NonLuxuryCar(String name) { 8 | this.name = name; 9 | } 10 | 11 | @Override 12 | public String name() { 13 | return this.name; 14 | } 15 | 16 | @Override 17 | public String features() { 18 | return "Non-Luxury Car Features "; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/abstractfactory/car/NonLuxurySUV.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.abstractfactory.car; 2 | 3 | public class NonLuxurySUV implements SUV { 4 | 5 | private final String name; 6 | 7 | public NonLuxurySUV(String name) { 8 | this.name = name; 9 | } 10 | 11 | @Override 12 | public String name() { 13 | return this.name; 14 | } 15 | 16 | @Override 17 | public String features() { 18 | return "Non-Luxury SUV Features "; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/abstractfactory/car/NonLuxuryVehicleFactory.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.abstractfactory.car; 2 | 3 | public class NonLuxuryVehicleFactory extends VehicleFactory { 4 | 5 | @Override 6 | public Car car() { 7 | return new NonLuxuryCar("NL-C"); 8 | } 9 | 10 | @Override 11 | public SUV suv() { 12 | return new NonLuxurySUV("NL-S"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/abstractfactory/car/SUV.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.abstractfactory.car; 2 | 3 | public interface SUV { 4 | 5 | String name(); 6 | 7 | String features(); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/abstractfactory/car/VehicleFactory.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.abstractfactory.car; 2 | 3 | public abstract class VehicleFactory { 4 | 5 | public static final String LUXURY_VEHICLE = "Luxury"; 6 | public static final String NON_LUXURY_VEHICLE = "Non-Luxury"; 7 | 8 | public abstract Car car(); 9 | 10 | public abstract SUV suv(); 11 | 12 | public static VehicleFactory vehicleFactory(String type) { 13 | if (VehicleFactory.LUXURY_VEHICLE.equals(type)) { 14 | return new LuxuryVehicleFactory(); 15 | } 16 | if (VehicleFactory.NON_LUXURY_VEHICLE.equals(type)) { 17 | return new NonLuxuryVehicleFactory(); 18 | } 19 | 20 | return new LuxuryVehicleFactory(); 21 | } 22 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/builder/email/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.builder.email; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | Email email = Email.builder() 7 | .addRecipient("bad@foo.com") 8 | .addRecipient("coder@foo.com") 9 | .withMessage("Your first Builder Pattern") 10 | .withSignature("Clean Coder") 11 | .build(); 12 | 13 | email.send(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/builder/meal/AdultMealBuilder.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.builder.meal; 2 | 3 | public class AdultMealBuilder extends MealBuilder { 4 | 5 | @Override 6 | public void buildDrink() { 7 | meal().drink("Adult drink"); 8 | } 9 | 10 | @Override 11 | public void buildMain() { 12 | meal().main("Adult main"); 13 | } 14 | 15 | @Override 16 | public void buildDessert() { 17 | meal().dessert("Adult dessert"); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/builder/meal/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.builder.meal; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | MealDirector director = new MealDirector(); 7 | MealBuilder builder; 8 | boolean isKid = false; 9 | 10 | if (isKid) { 11 | builder = new KidsMealBuilder(); 12 | } else { 13 | builder = new AdultMealBuilder(); 14 | } 15 | 16 | Meal meal = director.createMeal(builder); 17 | System.out.println(meal.main()); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/builder/meal/KidsMealBuilder.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.builder.meal; 2 | 3 | public class KidsMealBuilder extends MealBuilder { 4 | 5 | @Override 6 | public void buildDrink() { 7 | meal().drink("Kids drink"); 8 | } 9 | 10 | @Override 11 | public void buildMain() { 12 | meal().main("Kids main"); 13 | } 14 | 15 | @Override 16 | public void buildDessert() { 17 | meal().dessert("Kids dessert"); 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/builder/meal/Meal.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.builder.meal; 2 | 3 | public class Meal { 4 | 5 | private String drink; 6 | private String main; 7 | private String dessert; 8 | 9 | public String drink() { 10 | return this.drink; 11 | } 12 | 13 | public void drink(String drink) { 14 | this.drink = drink; 15 | } 16 | 17 | public String main() { 18 | return this.main; 19 | } 20 | 21 | public void main(String main) { 22 | this.main = main; 23 | } 24 | 25 | public String dessert() { 26 | return this.dessert; 27 | } 28 | 29 | public void dessert(String dessert) { 30 | this.dessert = dessert; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/builder/meal/MealBuilder.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.builder.meal; 2 | 3 | public abstract class MealBuilder { 4 | 5 | private final Meal meal; 6 | 7 | protected MealBuilder() { 8 | this.meal = new Meal(); 9 | } 10 | 11 | public abstract void buildDrink(); 12 | 13 | public abstract void buildMain(); 14 | 15 | public abstract void buildDessert(); 16 | 17 | public Meal meal() { 18 | return this.meal; 19 | } 20 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/builder/meal/MealDirector.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.builder.meal; 2 | 3 | public class MealDirector { 4 | 5 | public Meal createMeal(MealBuilder builder) { 6 | builder.buildDrink(); 7 | builder.buildMain(); 8 | builder.buildDessert(); 9 | 10 | return builder.meal(); 11 | } 12 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/builder/pizza/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.builder.pizza; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | Luigi luigi = new Luigi(new HawaiianPizzaBuilder()); 7 | Pizza pizza = luigi.bakePizza(); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/builder/pizza/HawaiianPizzaBuilder.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.builder.pizza; 2 | 3 | class HawaiianPizzaBuilder extends PizzaBuilder { 4 | 5 | @Override 6 | public void buildDough() { 7 | this.pizza().dough("cross"); 8 | } 9 | 10 | @Override 11 | public void buildSauce() { 12 | this.pizza().sauce("mild"); 13 | } 14 | 15 | @Override 16 | public void buildTopping() { 17 | this.pizza().topping("ham+pineapple"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/builder/pizza/Luigi.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.builder.pizza; 2 | 3 | class Luigi { 4 | private final PizzaBuilder pizzaBuilder; 5 | 6 | Luigi(PizzaBuilder pizzaBuilder) { 7 | this.pizzaBuilder = pizzaBuilder; 8 | } 9 | 10 | public Pizza bakePizza() { 11 | this.pizzaBuilder.buildDough(); 12 | this.pizzaBuilder.buildSauce(); 13 | this.pizzaBuilder.buildTopping(); 14 | 15 | return this.pizzaBuilder.pizza(); 16 | } 17 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/builder/pizza/MargheritaPizzaBuilder.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.builder.pizza; 2 | 3 | class MargheritaPizzaBuilder extends PizzaBuilder { 4 | 5 | @Override 6 | public void buildDough() { 7 | this.pizza().dough("cross"); 8 | } 9 | 10 | @Override 11 | public void buildSauce() { 12 | this.pizza().sauce("mild"); 13 | } 14 | 15 | @Override 16 | public void buildTopping() { 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/builder/pizza/Pizza.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.builder.pizza; 2 | 3 | final class Pizza { 4 | private String dough; 5 | private String sauce; 6 | private String topping; 7 | 8 | public void dough(String dough) { 9 | this.dough = dough; 10 | } 11 | 12 | public void sauce(String sauce) { 13 | this.sauce = sauce; 14 | } 15 | 16 | public void topping(String topping) { 17 | this.topping = topping; 18 | } 19 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/builder/pizza/PizzaBuilder.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.builder.pizza; 2 | 3 | abstract class PizzaBuilder { 4 | private final Pizza pizza; 5 | 6 | PizzaBuilder() { 7 | this.pizza = new Pizza(); 8 | } 9 | 10 | public Pizza pizza() { 11 | return this.pizza; 12 | } 13 | 14 | public abstract void buildDough(); 15 | 16 | public abstract void buildSauce(); 17 | 18 | public abstract void buildTopping(); 19 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/factorymethod/department/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.factorymethod.department; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | Department department = new TechDepartment(); 7 | department.fire(1); 8 | } 9 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/factorymethod/department/Department.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.factorymethod.department; 2 | 3 | public abstract class Department { 4 | 5 | protected abstract Employee createEmployee(int id); 6 | 7 | public void fire(int id) { 8 | Employee employee = createEmployee(id); 9 | 10 | employee.paySalary(); 11 | employee.dismiss(); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/factorymethod/department/Employee.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.factorymethod.department; 2 | 3 | public interface Employee { 4 | 5 | void paySalary(); 6 | 7 | void dismiss(); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/factorymethod/department/MarketingDepartment.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.factorymethod.department; 2 | 3 | public class MarketingDepartment extends Department { 4 | 5 | @Override 6 | public Employee createEmployee(int id) { 7 | return new MarketingSpecialist(id); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/factorymethod/department/MarketingSpecialist.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.factorymethod.department; 2 | 3 | public class MarketingSpecialist implements Employee { 4 | 5 | private final int id; 6 | 7 | public MarketingSpecialist(int id) { 8 | this.id = id; 9 | } 10 | 11 | @Override 12 | public void paySalary() { 13 | } 14 | 15 | @Override 16 | public void dismiss() { 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/factorymethod/department/Programmer.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.factorymethod.department; 2 | 3 | public class Programmer implements Employee { 4 | 5 | private final int id; 6 | 7 | public Programmer(int id) { 8 | this.id = id; 9 | } 10 | 11 | @Override 12 | public void paySalary() { 13 | } 14 | 15 | @Override 16 | public void dismiss() { 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/factorymethod/department/TechDepartment.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.factorymethod.department; 2 | 3 | public class TechDepartment extends Department { 4 | 5 | @Override 6 | public Employee createEmployee(int id) { 7 | return new Programmer(id); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/factorymethod/logger/AbstractLoggerCreator.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.factorymethod.logger; 2 | 3 | public abstract class AbstractLoggerCreator { 4 | 5 | public Logger logger() { 6 | // depending on the subclass, we'll get a particular logger. 7 | Logger logger = createLogger(); 8 | 9 | // could do other operations on the logger here 10 | logger.log(String.format("Logger %s are used.", logger.name())); 11 | 12 | return logger; 13 | } 14 | 15 | protected abstract Logger createLogger(); 16 | } 17 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/factorymethod/logger/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.factorymethod.logger; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | AbstractLoggerCreator creator = new ConsoleLoggerCreator(); 7 | Logger logger = creator.logger(); 8 | logger.log("message"); 9 | } 10 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/factorymethod/logger/ConsoleLogger.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.factorymethod.logger; 2 | 3 | public class ConsoleLogger implements Logger { 4 | 5 | @Override 6 | public void log(String message) { 7 | System.out.println(message); 8 | } 9 | 10 | @Override 11 | public String name() { 12 | return getClass().getSimpleName(); 13 | } 14 | 15 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/factorymethod/logger/ConsoleLoggerCreator.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.factorymethod.logger; 2 | 3 | public class ConsoleLoggerCreator extends AbstractLoggerCreator { 4 | 5 | @Override 6 | public Logger createLogger() { 7 | return new ConsoleLogger(); 8 | } 9 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/factorymethod/logger/Logger.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.factorymethod.logger; 2 | 3 | public interface Logger { 4 | 5 | String name(); 6 | 7 | void log(String message); 8 | } 9 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/singleton/eager/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.singleton.eager; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | System.out.println(Singleton.getInstance().toString()); 7 | System.out.println(Singleton.getInstance().toString()); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/singleton/eager/Singleton.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.singleton.eager; 2 | 3 | public final class Singleton { 4 | private static final Singleton instance = new Singleton(); 5 | 6 | private Singleton() { 7 | } 8 | 9 | // Eager Loading 10 | public static Singleton getInstance() { 11 | return instance; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/singleton/lazy/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.singleton.lazy; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | System.out.println(Singleton.getInstance().toString()); 7 | System.out.println(Singleton.getInstance().toString()); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/singleton/lazy/Singleton.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.singleton.lazy; 2 | 3 | public final class Singleton { 4 | private static Singleton instance; 5 | 6 | private Singleton() { 7 | } 8 | 9 | // Lazy Loading 10 | public static synchronized Singleton getInstance() { 11 | if (instance == null) { 12 | instance = new Singleton(); 13 | } 14 | 15 | return instance; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/singleton/usingenum/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.singleton.usingenum; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | System.out.println(Singleton.INSTANCE == Singleton.INSTANCE); 7 | 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/creational/singleton/usingenum/Singleton.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.creational.singleton.usingenum; 2 | 3 | public enum Singleton { 4 | 5 | INSTANCE 6 | 7 | } 8 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/adapter/sorter/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.adapter.sorter; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | int[] numbers = {34, 2, 4, 12, 1}; 7 | 8 | Sorter sorter = new SortListAdapter(); 9 | sorter.sort(numbers); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/adapter/sorter/NumberSorter.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.adapter.sorter; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /* 7 | * This is our adaptee, a third party implementation of a 8 | * number sorter that deals with Lists, not arrays. 9 | */ 10 | public class NumberSorter { 11 | 12 | public List sort(List numbers) { 13 | // sort and return 14 | return new ArrayList<>(); 15 | } 16 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/adapter/sorter/SortListAdapter.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.adapter.sorter; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class SortListAdapter implements Sorter { 7 | 8 | @Override 9 | public int[] sort(int[] numbers) { 10 | List numberList = new ArrayList<>(); 11 | 12 | // convert the array to a List 13 | 14 | // call the adapter 15 | NumberSorter sorter = new NumberSorter(); 16 | numberList = sorter.sort(numberList); 17 | 18 | // convert the list back to an array and return 19 | 20 | return numbers; 21 | } 22 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/adapter/sorter/Sorter.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.adapter.sorter; 2 | 3 | //this is our Target interface 4 | public interface Sorter { 5 | 6 | int[] sort(int[] numbers); 7 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/adapter/textformatter/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.adapter.textformatter; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | String text = "Adapter Pattern 1. Adapter Pattern 2. Adapter Pattern 3."; 7 | 8 | TextFormattable tf = new NewlineFormatter(); 9 | System.out.println(tf.formatText(text, ".")); 10 | 11 | tf = new CsvAdapter(new CsvFormatter()); 12 | System.out.println(tf.formatText(text, ".")); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/adapter/textformatter/CsvAdapter.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.adapter.textformatter; 2 | 3 | public class CsvAdapter implements TextFormattable { 4 | 5 | private final CsvFormattable csvFormattable; 6 | 7 | public CsvAdapter(CsvFormatter csvFormattable) { 8 | this.csvFormattable = csvFormattable; 9 | } 10 | 11 | @Override 12 | public String formatText(String text, String separator) { 13 | return this.csvFormattable.formatCsv(text, separator); 14 | } 15 | 16 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/adapter/textformatter/CsvFormattable.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.adapter.textformatter; 2 | 3 | public interface CsvFormattable { 4 | 5 | String formatCsv(String text, String separator); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/adapter/textformatter/CsvFormatter.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.adapter.textformatter; 2 | 3 | import java.util.regex.Pattern; 4 | 5 | public class CsvFormatter implements CsvFormattable { 6 | 7 | @Override 8 | public String formatCsv(String text, String separator) { 9 | if (text != null && separator != null) { 10 | return String.join(", ", text.split(Pattern.quote(separator))); 11 | } 12 | 13 | return null; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/adapter/textformatter/NewlineFormatter.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.adapter.textformatter; 2 | 3 | import java.util.regex.Pattern; 4 | import java.util.stream.Collectors; 5 | import java.util.stream.Stream; 6 | 7 | public class NewlineFormatter implements TextFormattable { 8 | 9 | @Override 10 | public String formatText(String text, String separator) { 11 | if (text != null && separator != null) { 12 | return Stream.of(text.split(Pattern.quote(separator))) 13 | .map(String::stripLeading) 14 | .collect(Collectors.joining(System.lineSeparator())); 15 | } 16 | 17 | return null; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/adapter/textformatter/TextFormattable.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.adapter.textformatter; 2 | 3 | public interface TextFormattable { 4 | 5 | String formatText(String text, String separator); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/bridge/message/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.bridge.message; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | sendSms(); 7 | sendEmail(); 8 | } 9 | 10 | private static void sendSms() { 11 | MessageSender sender = new SmsMessageSender(); 12 | Message message = new SmsMessage(sender); 13 | message.send(); 14 | } 15 | 16 | private static void sendEmail() { 17 | MessageSender sender = new EmailMessageSender(); 18 | Message message = new EmailMessage(sender); 19 | message.send(); 20 | } 21 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/bridge/message/EmailMessage.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.bridge.message; 2 | 3 | public class EmailMessage extends Message { 4 | 5 | public EmailMessage(MessageSender messageSender) { 6 | super(messageSender); 7 | } 8 | 9 | @Override 10 | public void send() { 11 | messageSender().sendMessage(); 12 | } 13 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/bridge/message/EmailMessageSender.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.bridge.message; 2 | 3 | public class EmailMessageSender implements MessageSender { 4 | 5 | @Override 6 | public void sendMessage() { 7 | System.out.println("Sending email message..."); 8 | } 9 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/bridge/message/Message.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.bridge.message; 2 | 3 | public abstract class Message { 4 | 5 | private final MessageSender messageSender; 6 | 7 | protected Message(MessageSender messageSender) { 8 | this.messageSender = messageSender; 9 | } 10 | 11 | public MessageSender messageSender() { 12 | return this.messageSender; 13 | } 14 | 15 | abstract void send(); 16 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/bridge/message/MessageSender.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.bridge.message; 2 | 3 | public interface MessageSender { 4 | 5 | void sendMessage(); 6 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/bridge/message/SmsMessage.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.bridge.message; 2 | 3 | public class SmsMessage extends Message { 4 | 5 | public SmsMessage(MessageSender messageSender) { 6 | super(messageSender); 7 | } 8 | 9 | @Override 10 | public void send() { 11 | messageSender().sendMessage(); 12 | } 13 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/bridge/message/SmsMessageSender.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.bridge.message; 2 | 3 | public class SmsMessageSender implements MessageSender { 4 | 5 | @Override 6 | public void sendMessage() { 7 | System.out.println("Sending sms message..."); 8 | } 9 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/bridge/television/Philips.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.bridge.television; 2 | 3 | public class Philips implements Television { 4 | 5 | @Override 6 | public void on() { 7 | System.out.println("On"); 8 | } 9 | 10 | @Override 11 | public void off() { 12 | System.out.println("Off"); 13 | } 14 | 15 | @Override 16 | public void channel(int channel) { 17 | System.out.println(channel); 18 | } 19 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/bridge/television/RemoteControl.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.bridge.television; 2 | 3 | public abstract class RemoteControl { 4 | 5 | private final Television television; 6 | 7 | protected RemoteControl(Television television) { 8 | this.television = television; 9 | } 10 | 11 | public void on() { 12 | this.television.on(); 13 | } 14 | 15 | public void off() { 16 | this.television.off(); 17 | } 18 | 19 | public void channel(int channel) { 20 | this.television.channel(channel); 21 | } 22 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/bridge/television/Samsung.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.bridge.television; 2 | 3 | public class Samsung implements Television { 4 | 5 | @Override 6 | public void on() { 7 | System.out.println("On"); 8 | } 9 | 10 | @Override 11 | public void off() { 12 | System.out.println("Off"); 13 | } 14 | 15 | @Override 16 | public void channel(int channel) { 17 | System.out.println(channel); 18 | } 19 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/bridge/television/SmartRemoteControl.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.bridge.television; 2 | 3 | public class SmartRemoteControl extends RemoteControl { 4 | 5 | private int channel; 6 | 7 | public SmartRemoteControl(Television television) { 8 | super(television); 9 | } 10 | 11 | public void nextChannel() { 12 | this.channel++; 13 | channel(this.channel); 14 | } 15 | 16 | public void previousChannel() { 17 | this.channel--; 18 | channel(this.channel); 19 | } 20 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/bridge/television/Television.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.bridge.television; 2 | 3 | public interface Television { 4 | 5 | void on(); 6 | 7 | void off(); 8 | 9 | void channel(int channel); 10 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/composite/graphic/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.composite.graphic; 2 | 3 | class Client { 4 | public static void main(String[] args) { 5 | Composite sheet = new Sheet(); 6 | 7 | Composite r1 = new Row(); 8 | r1.add(new Column()); 9 | r1.add(new Column()); 10 | sheet.add(r1); 11 | 12 | Composite r2 = new Row(); 13 | r2.add(new Column()); 14 | r2.add(new Column()); 15 | sheet.add(r2); 16 | 17 | sheet.paint(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/composite/graphic/Column.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.composite.graphic; 2 | 3 | public class Column extends Composite { 4 | 5 | @Override 6 | public void paint() { 7 | System.out.printf(" %s%n", Column.class.getSimpleName()); 8 | super.paint(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/composite/graphic/Component.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.composite.graphic; 2 | 3 | public interface Component { 4 | void paint(); 5 | } 6 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/composite/graphic/Composite.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.composite.graphic; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public abstract class Composite implements Component { 7 | 8 | private final List components = new ArrayList<>(); 9 | 10 | @Override 11 | public void paint() { 12 | for (Component component : this.components) { 13 | component.paint(); 14 | } 15 | } 16 | 17 | public void add(Component component) { 18 | this.components.add(component); 19 | } 20 | 21 | public void remove(Component component) { 22 | this.components.remove(component); 23 | } 24 | 25 | public Component get(int index) { 26 | return this.components.get(index); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/composite/graphic/Row.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.composite.graphic; 2 | 3 | public class Row extends Composite { 4 | 5 | @Override 6 | public void paint() { 7 | System.out.printf(" %s%n", Row.class.getSimpleName()); 8 | super.paint(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/composite/graphic/Sheet.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.composite.graphic; 2 | 3 | public class Sheet extends Composite { 4 | 5 | @Override 6 | public void paint() { 7 | System.out.println(Sheet.class.getSimpleName()); 8 | super.paint(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/composite/organizationchart/CTO.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.composite.organizationchart; 2 | 3 | public class CTO extends DisciplinaryLeadership { 4 | 5 | @Override 6 | public void draw() { 7 | System.out.println(CTO.class.getSimpleName()); 8 | super.draw(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/composite/organizationchart/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.composite.organizationchart; 2 | 3 | class Client { 4 | public static void main(String[] args) { 5 | DisciplinaryLeadership cto = new CTO(); 6 | DisciplinaryLeadership vp1 = new VP(); 7 | DisciplinaryLeadership vp2 = new VP(); 8 | 9 | vp1.add(new Developer()); 10 | vp1.add(new Developer()); 11 | 12 | vp2.add(new Developer()); 13 | vp2.add(new Developer()); 14 | vp2.add(new Developer()); 15 | 16 | cto.add(vp1); 17 | cto.add(vp2); 18 | 19 | cto.draw(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/composite/organizationchart/Developer.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.composite.organizationchart; 2 | 3 | public class Developer implements Employee { 4 | 5 | @Override 6 | public void draw() { 7 | System.out.printf(" %s%n", Developer.class.getSimpleName()); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/composite/organizationchart/DisciplinaryLeadership.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.composite.organizationchart; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public abstract class DisciplinaryLeadership implements Employee { 7 | 8 | private final List employees = new ArrayList<>(); 9 | 10 | @Override 11 | public void draw() { 12 | for (Employee employee : this.employees) { 13 | employee.draw(); 14 | } 15 | } 16 | 17 | public void add(Employee employee) { 18 | this.employees.add(employee); 19 | } 20 | 21 | public Employee get(int index) { 22 | return this.employees.get(index); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/composite/organizationchart/Employee.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.composite.organizationchart; 2 | 3 | public interface Employee { 4 | void draw(); 5 | } 6 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/composite/organizationchart/VP.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.composite.organizationchart; 2 | 3 | public class VP extends DisciplinaryLeadership { 4 | 5 | @Override 6 | public void draw() { 7 | System.out.printf(" %s%n", VP.class.getSimpleName()); 8 | super.draw(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/decorator/message/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.decorator.message; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | new DefaultMessage().print("DefaultMessage"); 7 | new UpperCaseMessage(new DefaultMessage()).print("DefaultMessage"); 8 | new TimeStampMessage(new DefaultMessage()).print("DefaultMessage"); 9 | new UpperCaseMessage(new TimeStampMessage(new DefaultMessage())).print("DefaultMessage"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/decorator/message/DefaultMessage.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.decorator.message; 2 | 3 | public class DefaultMessage implements Message { 4 | 5 | @Override 6 | public void print(String text) { 7 | System.out.println(text); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/decorator/message/Message.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.decorator.message; 2 | 3 | public interface Message { 4 | 5 | void print(String text); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/decorator/message/TimeStampMessage.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.decorator.message; 2 | 3 | import java.time.LocalDateTime; 4 | 5 | public class TimeStampMessage implements Message { 6 | 7 | private final Message message; 8 | 9 | public TimeStampMessage(Message message) { 10 | this.message = message; 11 | } 12 | 13 | @Override 14 | public void print(String text) { 15 | this.message.print(String.format("%s %s", LocalDateTime.now(), text)); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/decorator/message/UpperCaseMessage.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.decorator.message; 2 | 3 | public class UpperCaseMessage implements Message { 4 | 5 | private final Message message; 6 | 7 | public UpperCaseMessage(Message message) { 8 | this.message = message; 9 | } 10 | 11 | @Override 12 | public void print(String text) { 13 | this.message.print(text.toUpperCase()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/decorator/window/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.decorator.window; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | Window window = new SimpleWindow(); 7 | window.renderWindow(); 8 | 9 | // at some point later maybe text size becomes larger than the window thus the scrolling behavior must be added 10 | window = new ScrollableWindow(window); // decorate old window, now window object has additional behavior / state 11 | 12 | window.renderWindow(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/decorator/window/DecoratedWindow.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.decorator.window; 2 | 3 | public class DecoratedWindow implements Window { 4 | private Window window; 5 | 6 | public DecoratedWindow(Window window) { 7 | this.window = window; 8 | } 9 | 10 | @Override 11 | public void renderWindow() { 12 | this.window.renderWindow(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/decorator/window/ScrollableWindow.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.decorator.window; 2 | 3 | public class ScrollableWindow extends DecoratedWindow { 4 | private Object scrollBar; 5 | 6 | public ScrollableWindow(Window window) { 7 | super(window); 8 | } 9 | 10 | @Override 11 | public void renderWindow() { 12 | super.renderWindow(); 13 | renderScrollBar(); 14 | } 15 | 16 | private void renderScrollBar() { 17 | this.scrollBar = new Object(); // prepare scrollbar 18 | // render scrollbar 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/decorator/window/SimpleWindow.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.decorator.window; 2 | 3 | public class SimpleWindow implements Window { 4 | 5 | @Override 6 | public void renderWindow() { 7 | // implementation of rendering details 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/decorator/window/Window.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.decorator.window; 2 | 3 | public interface Window { 4 | void renderWindow(); 5 | } 6 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/facade/smarthome/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.facade.smarthome; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | SmartHomeFacade smartHomeFacade = new SmartHomeFacade(); 7 | 8 | smartHomeFacade.leaveHome(); 9 | smartHomeFacade.returnHome(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/facade/smarthome/LightController.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.facade.smarthome; 2 | 3 | class LightController { 4 | 5 | public void turnOnLights() { 6 | System.out.println("Turning on lights"); 7 | } 8 | 9 | public void turnOffLights() { 10 | System.out.println("Turning off lights"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/facade/smarthome/SecuritySystem.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.facade.smarthome; 2 | 3 | class SecuritySystem { 4 | 5 | public void armSystem() { 6 | System.out.println("Arming security system"); 7 | } 8 | 9 | public void disarmSystem() { 10 | System.out.println("Disarming security system"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/facade/smarthome/ThermostatController.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.facade.smarthome; 2 | 3 | class ThermostatController { 4 | 5 | public void setTemperature(int temperature) { 6 | System.out.println("Setting temperature to " + temperature + " degrees Celsius"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/facade/travel/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.facade.travel; 2 | 3 | import java.time.LocalDate; 4 | 5 | class Client { 6 | 7 | public static void main(String[] args) { 8 | TravelFacade facade = new TravelFacade(); 9 | facade.availableTravels(LocalDate.now(), LocalDate.now().plusMonths(2)); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/facade/travel/Flight.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.facade.travel; 2 | 3 | public interface Flight { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/facade/travel/FlightBooker.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.facade.travel; 2 | 3 | import java.time.LocalDate; 4 | import java.util.List; 5 | 6 | public class FlightBooker { 7 | 8 | public List flights(LocalDate from, LocalDate to) { 9 | // returns flights available in the particular date range 10 | return null; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/facade/travel/Hotel.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.facade.travel; 2 | 3 | public interface Hotel { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/facade/travel/HotelBooker.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.facade.travel; 2 | 3 | import java.time.LocalDate; 4 | import java.util.List; 5 | 6 | public class HotelBooker { 7 | 8 | public List hotels(LocalDate from, LocalDate to) { 9 | // returns hotels available in the particular date range 10 | return null; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/facade/travel/TravelFacade.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.facade.travel; 2 | 3 | import java.time.LocalDate; 4 | import java.util.List; 5 | 6 | public class TravelFacade { 7 | private HotelBooker hotelBooker; 8 | private FlightBooker flightBooker; 9 | 10 | public Travels availableTravels(LocalDate from, LocalDate to) { 11 | List flights = this.flightBooker.flights(from, to); 12 | List hotels = this.hotelBooker.hotels(from, to); 13 | 14 | // process 15 | return null; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/facade/travel/Travels.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.facade.travel; 2 | 3 | public interface Travels { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/flyweight/city/City.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.flyweight.city; 2 | 3 | 4 | public record City(String country, String countryCode, String name) { 5 | 6 | } 7 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/flyweight/city/CityFactory.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.flyweight.city; 2 | 3 | import java.util.HashSet; 4 | import java.util.Set; 5 | 6 | public final class CityFactory { 7 | 8 | private final Set cities = new HashSet<>(); 9 | 10 | public City of(String country, String countryCode, String name) { 11 | for (City city : this.cities) { 12 | if (city.country().equals(country) 13 | && city.countryCode().equals(countryCode) 14 | && city.name().equals(name)) { 15 | return city; 16 | } 17 | } 18 | 19 | City city = new City(country, countryCode, name); 20 | this.cities.add(city); 21 | 22 | return city; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/flyweight/city/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.flyweight.city; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | CityFactory factory = new CityFactory(); 7 | 8 | // Will use same city instance 9 | new Person("Forster", "Gamlen", "7654 Ruskin Center", factory.of("United States", "US", "Carson City")); 10 | new Person("Nevin", "Roddell", "5 Del Sol Alley", factory.of("United States", "US", "Carson City")); 11 | new Person("Hunter", "Lewins", "33733 Heffernan Circle", factory.of("United States", "US", "Carson City")); 12 | 13 | new Person("Reube", "Gregoretti", "08 Melrose Street", factory.of("Japan", "JP", "Mutsu")); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/flyweight/city/Person.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.flyweight.city; 2 | 3 | public record Person(String firstName, String lastName, String street, City city) { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/flyweight/font/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.flyweight.font; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | FontFactory factory = new FontFactory(); 7 | 8 | System.out.println(factory.of("Helvetica", 12)); 9 | System.out.println(factory.of("Arial ", 10)); 10 | 11 | // Will return same objects 12 | System.out.println(factory.of("Helvetica", 12)); 13 | System.out.println(factory.of("Arial ", 10)); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/flyweight/font/Font.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.flyweight.font; 2 | 3 | 4 | public record Font(String name, int size) { 5 | 6 | } 7 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/flyweight/font/FontFactory.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.flyweight.font; 2 | 3 | import java.util.HashSet; 4 | import java.util.Set; 5 | 6 | public final class FontFactory { 7 | 8 | private final Set fonts = new HashSet<>(); 9 | 10 | public Font of(String name, int size) { 11 | for (Font font : this.fonts) { 12 | if (font.name().equals(name) && font.size() == size) { 13 | return font; 14 | } 15 | } 16 | 17 | Font font = new Font(name, size); 18 | this.fonts.add(font); 19 | 20 | return font; 21 | } 22 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/proxy/imageviewer/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.proxy.imageviewer; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | ImageViewer beer = new ImageViewerProxy("./img/beer.png"); 7 | ImageViewer hammock = new ImageViewerProxy("./img/hammock.png"); 8 | 9 | beer.display(); 10 | beer.display(); // DefaultImageViewer will be call and be executed once 11 | 12 | hammock.display(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/proxy/imageviewer/DefaultImageViewer.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.proxy.imageviewer; 2 | 3 | public final class DefaultImageViewer implements ImageViewer { 4 | 5 | private final Image image; 6 | 7 | public DefaultImageViewer(String path) { 8 | // Slow operation 9 | this.image = Image.load(path); 10 | } 11 | 12 | @Override 13 | public void display() { 14 | // Slow operation 15 | this.image.display(); 16 | } 17 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/proxy/imageviewer/Image.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.proxy.imageviewer; 2 | 3 | public interface Image { 4 | 5 | void display(); 6 | 7 | static Image load(String path) { 8 | // Not implemented 9 | return null; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/proxy/imageviewer/ImageViewer.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.proxy.imageviewer; 2 | 3 | interface ImageViewer { 4 | void display(); 5 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/proxy/imageviewer/ImageViewerProxy.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.proxy.imageviewer; 2 | 3 | public final class ImageViewerProxy implements ImageViewer { 4 | 5 | private final String path; 6 | private ImageViewer viewer; 7 | 8 | public ImageViewerProxy(String path) { 9 | this.path = path; 10 | } 11 | 12 | @Override 13 | public void display() { 14 | if (this.viewer == null) { 15 | this.viewer = new DefaultImageViewer(this.path); 16 | } 17 | 18 | this.viewer.display(); 19 | } 20 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/proxy/spaceship/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.proxy.spaceship; 2 | 3 | class Client { 4 | 5 | public static void main(String[] args) { 6 | Spaceship ship = new MillenniumFalconProxy(new Pilot("Han Solo")); 7 | ship.fly(); 8 | 9 | ship = new MillenniumFalconProxy(new Pilot("Darth Vader")); 10 | ship.fly(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/proxy/spaceship/MillenniumFalcon.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.proxy.spaceship; 2 | 3 | public final class MillenniumFalcon implements Spaceship { 4 | 5 | @Override 6 | public void fly() { 7 | System.out.println("Welcome, Han!"); 8 | } 9 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/proxy/spaceship/MillenniumFalconProxy.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.proxy.spaceship; 2 | 3 | public final class MillenniumFalconProxy implements Spaceship { 4 | 5 | private final Pilot pilot; 6 | private final Spaceship ship; 7 | 8 | public MillenniumFalconProxy(Pilot pilot) { 9 | this.pilot = pilot; 10 | this.ship = new MillenniumFalcon(); 11 | } 12 | 13 | @Override 14 | public void fly() { 15 | if ("Han Solo".equals(this.pilot.name())) { 16 | this.ship.fly(); 17 | } else { 18 | System.out.printf("Sorry %s, only Han Solo can fly the Falcon!%n", this.pilot.name()); 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/proxy/spaceship/Pilot.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.proxy.spaceship; 2 | 3 | public record Pilot(String name) { 4 | 5 | } -------------------------------------------------------------------------------- /swcs-gof/src/main/java/swcs/gof/structural/proxy/spaceship/Spaceship.java: -------------------------------------------------------------------------------- 1 | package swcs.gof.structural.proxy.spaceship; 2 | 3 | interface Spaceship { 4 | void fly(); 5 | } -------------------------------------------------------------------------------- /swcs-junit/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 4.0.0 7 | 8 | 9 | swcs 10 | swcs-parent 11 | 0.0.1-SNAPSHOT 12 | 13 | 14 | swcs-junit 15 | swcs-junit 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /swcs-junit/src/main/java/swcs/junit/converter/FahrenheitCelsiusConverter.java: -------------------------------------------------------------------------------- 1 | package swcs.junit.converter; 2 | 3 | public final class FahrenheitCelsiusConverter { 4 | 5 | private FahrenheitCelsiusConverter() { 6 | } 7 | 8 | public static float toCelsius(float fahrenheit) { 9 | return ((fahrenheit - 32) * 5) / 9; 10 | } 11 | 12 | public static float toFahrenheit(float celsius) { 13 | return ((celsius * 9) / 5) + 32; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /swcs-junit/src/main/java/swcs/junit/football/FootballTeam.java: -------------------------------------------------------------------------------- 1 | package swcs.junit.football; 2 | 3 | public class FootballTeam implements Comparable { 4 | 5 | private final int gamesWon; 6 | 7 | public FootballTeam(int gamesWon) { 8 | if (gamesWon < 0) { 9 | throw new IllegalArgumentException("Not possible to have less than 0 games won! (was + " + gamesWon + ")"); 10 | } 11 | this.gamesWon = gamesWon; 12 | } 13 | 14 | public int gamesWon() { 15 | return this.gamesWon; 16 | } 17 | 18 | @Override 19 | public int compareTo(FootballTeam otherTeam) { 20 | return this.gamesWon - otherTeam.gamesWon(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /swcs-junit/src/main/java/swcs/junit/fridge/Fridge.java: -------------------------------------------------------------------------------- 1 | package swcs.junit.fridge; 2 | 3 | import java.util.Collection; 4 | import java.util.HashSet; 5 | 6 | public class Fridge { 7 | 8 | private final Collection foods; 9 | 10 | public Fridge() { 11 | this.foods = new HashSet<>(); 12 | } 13 | 14 | public boolean put(String item) { 15 | return this.foods.add(item); 16 | } 17 | 18 | public boolean contains(String item) { 19 | return this.foods.contains(item); 20 | } 21 | 22 | public void take(String item) throws NoSuchItemException { 23 | boolean result = this.foods.remove(item); 24 | 25 | if (!result) { 26 | throw new NoSuchItemException(); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /swcs-junit/src/main/java/swcs/junit/fridge/NoSuchItemException.java: -------------------------------------------------------------------------------- 1 | package swcs.junit.fridge; 2 | 3 | public class NoSuchItemException extends Exception { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-layering/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | 8 | swcs-parent 9 | 0.0.1-SNAPSHOT 10 | swcs 11 | 12 | 13 | swcs-layering 14 | swcs-clean 15 | jar 16 | 17 | -------------------------------------------------------------------------------- /swcs-layering/src/main/java/swcs/layering/after/reservation/ReservationController.java: -------------------------------------------------------------------------------- 1 | package swcs.layering.after.reservation; 2 | 3 | class ReservationController { 4 | 5 | private final ReservationService reservationService; 6 | 7 | ReservationController(ReservationService reservationService) { 8 | this.reservationService = reservationService; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /swcs-layering/src/main/java/swcs/layering/after/reservation/ReservationRepository.java: -------------------------------------------------------------------------------- 1 | package swcs.layering.after.reservation; 2 | 3 | class ReservationRepository { 4 | } 5 | -------------------------------------------------------------------------------- /swcs-layering/src/main/java/swcs/layering/after/reservation/ReservationService.java: -------------------------------------------------------------------------------- 1 | package swcs.layering.after.reservation; 2 | 3 | class ReservationService { 4 | 5 | private final ReservationRepository reservationRepository; 6 | 7 | ReservationService(ReservationRepository reservationRepository) { 8 | this.reservationRepository = reservationRepository; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /swcs-layering/src/main/java/swcs/layering/after/ticket/TicketController.java: -------------------------------------------------------------------------------- 1 | package swcs.layering.after.ticket; 2 | 3 | class TicketController { 4 | 5 | private final TicketService ticketService; 6 | 7 | TicketController(TicketService ticketService) { 8 | this.ticketService = ticketService; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /swcs-layering/src/main/java/swcs/layering/after/ticket/TicketRepository.java: -------------------------------------------------------------------------------- 1 | package swcs.layering.after.ticket; 2 | 3 | class TicketRepository { 4 | } 5 | -------------------------------------------------------------------------------- /swcs-layering/src/main/java/swcs/layering/after/ticket/TicketService.java: -------------------------------------------------------------------------------- 1 | package swcs.layering.after.ticket; 2 | 3 | class TicketService { 4 | 5 | private final TicketRepository ticketRepository; 6 | 7 | TicketService(TicketRepository ticketRepository) { 8 | this.ticketRepository = ticketRepository; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /swcs-layering/src/main/java/swcs/layering/before/repository/ReservationRepository.java: -------------------------------------------------------------------------------- 1 | package swcs.layering.before.repository; 2 | 3 | public class ReservationRepository { 4 | } 5 | -------------------------------------------------------------------------------- /swcs-layering/src/main/java/swcs/layering/before/repository/TicketRepository.java: -------------------------------------------------------------------------------- 1 | package swcs.layering.before.repository; 2 | 3 | public class TicketRepository { 4 | } 5 | -------------------------------------------------------------------------------- /swcs-layering/src/main/java/swcs/layering/before/service/ReservationService.java: -------------------------------------------------------------------------------- 1 | package swcs.layering.before.service; 2 | 3 | import swcs.layering.before.repository.ReservationRepository; 4 | 5 | public class ReservationService { 6 | 7 | private final ReservationRepository reservationRepository; 8 | 9 | public ReservationService(ReservationRepository reservationRepository) { 10 | this.reservationRepository = reservationRepository; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-layering/src/main/java/swcs/layering/before/service/TicketService.java: -------------------------------------------------------------------------------- 1 | package swcs.layering.before.service; 2 | 3 | import swcs.layering.before.repository.TicketRepository; 4 | 5 | public class TicketService { 6 | 7 | private final TicketRepository ticketRepository; 8 | 9 | public TicketService(TicketRepository ticketRepository) { 10 | this.ticketRepository = ticketRepository; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-layering/src/main/java/swcs/layering/before/web/ReservationController.java: -------------------------------------------------------------------------------- 1 | package swcs.layering.before.web; 2 | 3 | import swcs.layering.before.service.ReservationService; 4 | 5 | public class ReservationController { 6 | 7 | private final ReservationService reservationService; 8 | 9 | public ReservationController(ReservationService reservationService) { 10 | this.reservationService = reservationService; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-layering/src/main/java/swcs/layering/before/web/TicketController.java: -------------------------------------------------------------------------------- 1 | package swcs.layering.before.web; 2 | 3 | import swcs.layering.before.service.TicketService; 4 | 5 | public class TicketController { 6 | 7 | private final TicketService ticketService; 8 | 9 | public TicketController(TicketService ticketService) { 10 | this.ticketService = ticketService; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-mockito/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 4.0.0 7 | 8 | 9 | swcs 10 | swcs-parent 11 | 0.0.1-SNAPSHOT 12 | 13 | 14 | swcs-mockito 15 | swcs-mockito 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /swcs-mockito/src/main/java/swcs/mockito/carsearch/Car.java: -------------------------------------------------------------------------------- 1 | package swcs.mockito.carsearch; 2 | 3 | public interface Car { 4 | 5 | Engine engine(); 6 | 7 | Manufacturer manufacturer(); 8 | 9 | boolean isSportCar(); 10 | } -------------------------------------------------------------------------------- /swcs-mockito/src/main/java/swcs/mockito/carsearch/CarSearch.java: -------------------------------------------------------------------------------- 1 | package swcs.mockito.carsearch; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class CarSearch { 7 | 8 | private final List cars; 9 | 10 | public CarSearch() { 11 | this.cars = new ArrayList<>(); 12 | } 13 | 14 | public boolean addCar(Car car) { 15 | return this.cars.add(car); 16 | } 17 | 18 | public List findSportCars() { 19 | return this.cars.stream() 20 | .filter(Car::isSportCar) 21 | .toList(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /swcs-mockito/src/main/java/swcs/mockito/carsearch/Engine.java: -------------------------------------------------------------------------------- 1 | package swcs.mockito.carsearch; 2 | 3 | public interface Engine { 4 | 5 | int numberOfCylinders(); 6 | } 7 | -------------------------------------------------------------------------------- /swcs-mockito/src/main/java/swcs/mockito/carsearch/Manufacturer.java: -------------------------------------------------------------------------------- 1 | package swcs.mockito.carsearch; 2 | 3 | public interface Manufacturer { 4 | 5 | String name(); 6 | } 7 | -------------------------------------------------------------------------------- /swcs-mockito/src/main/java/swcs/mockito/raceresults/Client.java: -------------------------------------------------------------------------------- 1 | package swcs.mockito.raceresults; 2 | 3 | public interface Client { 4 | void receive(Message message); 5 | } 6 | -------------------------------------------------------------------------------- /swcs-mockito/src/main/java/swcs/mockito/raceresults/Message.java: -------------------------------------------------------------------------------- 1 | package swcs.mockito.raceresults; 2 | 3 | public interface Message { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-mockito/src/main/java/swcs/mockito/raceresults/RaceResultsService.java: -------------------------------------------------------------------------------- 1 | package swcs.mockito.raceresults; 2 | 3 | import java.util.Collection; 4 | import java.util.HashSet; 5 | 6 | public class RaceResultsService { 7 | 8 | private final Collection clients; 9 | 10 | public RaceResultsService() { 11 | this.clients = new HashSet<>(); 12 | } 13 | 14 | public void addSubscriber(Client client) { 15 | this.clients.add(client); 16 | } 17 | 18 | public void removeSubscriber(Client client) { 19 | this.clients.remove(client); 20 | } 21 | 22 | public void send(Message message) { 23 | for (Client client : this.clients) { 24 | client.receive(message); 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /swcs-order/pom.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 4.0.0 6 | 7 | 8 | swcs 9 | swcs-parent 10 | 0.0.1-SNAPSHOT 11 | 12 | 13 | swcs-order 14 | swcs-order 15 | jar 16 | 17 | -------------------------------------------------------------------------------- /swcs-order/src/main/java/swcs/order/after/Exporter.java: -------------------------------------------------------------------------------- 1 | package swcs.order.after; 2 | 3 | interface Exporter { 4 | void exportOrder(Order order); 5 | } -------------------------------------------------------------------------------- /swcs-order/src/main/java/swcs/order/after/Importer.java: -------------------------------------------------------------------------------- 1 | package swcs.order.after; 2 | 3 | interface Importer { 4 | Order importOrder(); 5 | } -------------------------------------------------------------------------------- /swcs-order/src/main/java/swcs/order/after/JsonExporter.java: -------------------------------------------------------------------------------- 1 | package swcs.order.after; 2 | 3 | import java.io.Writer; 4 | 5 | public class JsonExporter implements Exporter { 6 | 7 | private final Writer writer; 8 | 9 | public JsonExporter(Writer writer) { 10 | this.writer = writer; 11 | } 12 | 13 | @Override 14 | public void exportOrder(Order order) { 15 | // ... logic implementation 16 | 17 | // this.writer.write("{ \"order.id\":\"" + order.id() + "\""); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /swcs-order/src/main/java/swcs/order/after/JsonImporter.java: -------------------------------------------------------------------------------- 1 | package swcs.order.after; 2 | 3 | import java.io.Reader; 4 | 5 | public class JsonImporter implements Importer { 6 | 7 | private final Reader reader; 8 | 9 | public JsonImporter(Reader reader) { 10 | this.reader = reader; 11 | } 12 | 13 | @Override 14 | public Order importOrder() { 15 | // ... logic implementation 16 | 17 | return new Order(123); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /swcs-order/src/main/java/swcs/order/after/Order.java: -------------------------------------------------------------------------------- 1 | package swcs.order.after; 2 | 3 | import java.util.Objects; 4 | 5 | public final class Order { 6 | 7 | private final int id; 8 | 9 | public Order(int id) { 10 | this.id = id; 11 | } 12 | 13 | public Order(Importer source) { 14 | Objects.requireNonNull(source); 15 | 16 | Order order = source.importOrder(); 17 | this.id = order.id; 18 | } 19 | 20 | public int id() { 21 | return this.id; 22 | } 23 | 24 | public void export(Exporter destination) { 25 | Objects.requireNonNull(destination); 26 | 27 | destination.exportOrder(this); 28 | } 29 | 30 | } -------------------------------------------------------------------------------- /swcs-order/src/main/java/swcs/order/after/XmlExporter.java: -------------------------------------------------------------------------------- 1 | package swcs.order.after; 2 | 3 | import java.io.Writer; 4 | 5 | public class XmlExporter implements Exporter { 6 | 7 | private final Writer writer; 8 | 9 | public XmlExporter(Writer writer) { 10 | this.writer = writer; 11 | } 12 | 13 | @Override 14 | public void exportOrder(Order order) { 15 | // ... logic implementation 16 | 17 | // this.writer.write("" + order.id() + ""); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /swcs-order/src/main/java/swcs/order/after/XmlImporter.java: -------------------------------------------------------------------------------- 1 | package swcs.order.after; 2 | 3 | import java.io.Reader; 4 | 5 | public class XmlImporter implements Importer { 6 | 7 | private final Reader reader; 8 | 9 | public XmlImporter(Reader reader) { 10 | this.reader = reader; 11 | } 12 | 13 | @Override 14 | public Order importOrder() { 15 | // ... logic implementation 16 | 17 | return new Order(123); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /swcs-order/src/main/java/swcs/order/before/Order.java: -------------------------------------------------------------------------------- 1 | package swcs.order.before; 2 | 3 | import java.io.Writer; 4 | 5 | public class Order { 6 | 7 | public enum Format { 8 | JSON, XML 9 | } 10 | 11 | private int id; 12 | 13 | public Order(int id) { 14 | this.id = id; 15 | } 16 | 17 | public Order(String source, Format inputFormat) { 18 | // ... logic implementation 19 | } 20 | 21 | public void exportAsJson(Writer out) { 22 | // ... logic implementation 23 | } 24 | 25 | public void exportAsXml(Writer out) { 26 | // ... logic implementation 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /swcs-playground/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 4.0.0 7 | 8 | 9 | swcs 10 | swcs-parent 11 | 0.0.1-SNAPSHOT 12 | 13 | 14 | swcs-playground 15 | swcs-playground 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /swcs-playground/src/main/java/swcs/playground/Playground.java: -------------------------------------------------------------------------------- 1 | package swcs.playground; 2 | 3 | public class Playground { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-playground/src/test/java/swcs/playground/PlaygroundTest.java: -------------------------------------------------------------------------------- 1 | package swcs.playground; 2 | 3 | public class PlaygroundTest { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /swcs-rental/pom.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 4.0.0 6 | 7 | 8 | swcs 9 | swcs-parent 10 | 0.0.1-SNAPSHOT 11 | 12 | 13 | swcs-rental 14 | swcs-rental 15 | jar 16 | 17 | -------------------------------------------------------------------------------- /swcs-rental/src/main/java/swcs/rental/after/AbstractMovie.java: -------------------------------------------------------------------------------- 1 | package swcs.rental.after; 2 | 3 | import java.util.Objects; 4 | 5 | abstract class AbstractMovie implements Movie { 6 | 7 | private final String title; 8 | 9 | AbstractMovie(String title) { 10 | this.title = Objects.requireNonNull(title); 11 | } 12 | 13 | @Override 14 | public String title() { 15 | return this.title; 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /swcs-rental/src/main/java/swcs/rental/after/ChildrenMovie.java: -------------------------------------------------------------------------------- 1 | package swcs.rental.after; 2 | 3 | class ChildrenMovie extends AbstractMovie { 4 | 5 | private static final double CHARGE = 1; 6 | 7 | ChildrenMovie(String title) { 8 | super(title); 9 | } 10 | 11 | @Override 12 | public double charge() { 13 | return CHARGE; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /swcs-rental/src/main/java/swcs/rental/after/Movie.java: -------------------------------------------------------------------------------- 1 | package swcs.rental.after; 2 | 3 | public interface Movie { 4 | 5 | String title(); 6 | 7 | double charge(); 8 | } 9 | -------------------------------------------------------------------------------- /swcs-rental/src/main/java/swcs/rental/after/NewReleaseMovie.java: -------------------------------------------------------------------------------- 1 | package swcs.rental.after; 2 | 3 | class NewReleaseMovie extends AbstractMovie { 4 | 5 | private static final double CHARGE = 3; 6 | 7 | NewReleaseMovie(String title) { 8 | super(title); 9 | } 10 | 11 | @Override 12 | public double charge() { 13 | return CHARGE; 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /swcs-rental/src/main/java/swcs/rental/after/RegularMovie.java: -------------------------------------------------------------------------------- 1 | package swcs.rental.after; 2 | 3 | class RegularMovie extends AbstractMovie { 4 | 5 | private static final double CHARGE = 2; 6 | 7 | RegularMovie(String title) { 8 | super(title); 9 | } 10 | 11 | @Override 12 | public double charge() { 13 | return CHARGE; 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /swcs-rental/src/main/java/swcs/rental/after/Tester.java: -------------------------------------------------------------------------------- 1 | package swcs.rental.after; 2 | 3 | public class Tester { 4 | 5 | public static void main(String[] args) { 6 | Customer customer = new Customer("Better Coder"); 7 | customer.addRental(new Rental(new NewReleaseMovie("Clean Code"), 2)); 8 | customer.addRental(new Rental(new ChildrenMovie("Java"), 1)); 9 | 10 | customer.overview(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /swcs-rental/src/main/java/swcs/rental/before/Movie.java: -------------------------------------------------------------------------------- 1 | package swcs.rental.before; 2 | 3 | public class Movie { 4 | 5 | public static final int CHILDREN = 2; 6 | public static final int REGULAR = 0; 7 | public static final int NEW_RELEASE = 1; 8 | 9 | private String title; 10 | private int priceCode; 11 | 12 | public Movie(String title, int priceCode) { 13 | this.title = title; 14 | this.priceCode = priceCode; 15 | } 16 | 17 | public String title() { 18 | return this.title; 19 | } 20 | 21 | public int priceCode() { 22 | return this.priceCode; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /swcs-rental/src/main/java/swcs/rental/before/Rental.java: -------------------------------------------------------------------------------- 1 | package swcs.rental.before; 2 | 3 | final class Rental { 4 | 5 | private final Movie movie; 6 | private final int daysRented; 7 | 8 | Rental(Movie movie, int daysRented) { 9 | this.movie = movie; 10 | this.daysRented = daysRented; 11 | } 12 | 13 | public Movie movie() { 14 | return this.movie; 15 | } 16 | 17 | public int daysRented() { 18 | return this.daysRented; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /swcs-rental/src/main/java/swcs/rental/before/Tester.java: -------------------------------------------------------------------------------- 1 | package swcs.rental.before; 2 | 3 | public class Tester { 4 | 5 | public static void main(String[] args) { 6 | Customer customer = new Customer("Bad Coder"); 7 | customer.addRental(new Rental(new Movie("Clean Code", 2), Movie.NEW_RELEASE)); 8 | customer.addRental(new Rental(new Movie("Java", 1), Movie.CHILDREN)); 9 | 10 | customer.statement(); 11 | } 12 | } 13 | --------------------------------------------------------------------------------