├── .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 |
--------------------------------------------------------------------------------