The Visitor Pattern Explained and Implemented in Java | Behavioral Design Patterns | Geekific

แชร์
ฝัง
  • เผยแพร่เมื่อ 26 มิ.ย. 2024
  • Support us on Patreon: / geekific
    GitHub Repository: github.com/geekific-official/...
    Stay updated on our videos by subscribing to the channel and hitting the like button!
    I've received over the years a lot of feedback stating that the Visitor pattern is one of the hardest to grasp. In this video, we detail and explain the Visitor Design Pattern and hope that it'll clear things up!
    Timestamps:
    00:00 Introduction
    00:07 What is the Visitor Pattern?
    02:11 Visitor Pattern Implementation
    03:38 The Visitor Pattern Class Diagram
    05:02 Recap
    05:36 Thanks for Watching!
    If you found this video helpful, check other Geekific uploads:
    - Introduction to Design Patterns: • What are Design Patter...
    - UML Class and Object Diagrams: • UML Class and Object D...
    - SOLID Principles and Best Practices: • SOLID Design Principle...
    - The Iterator Pattern Explained and Implemented in Java: • The Iterator Pattern E...
    - The Strategy Pattern Explained and Implemented in Java: • The Strategy Pattern E...
    - The State Pattern Explained and Implemented in Java: • The State Pattern Expl...
    #Geekific #DesignPatterns #VisitorPattern #BehavioralPatterns

ความคิดเห็น • 63

  • @duganets
    @duganets ปีที่แล้ว +8

    by choosing good example pattern suddenly becomes very clear, thank you

  • @Jeff_Leon
    @Jeff_Leon ปีที่แล้ว +14

    You have no idea how helpful these videos are! ❤❤

  • @jordiyaputra8359
    @jordiyaputra8359 ปีที่แล้ว +2

    This explanation is very clear! Now I can finally understand this Visitor pattern thank to this video. Thank you!

  • @rayunn3502
    @rayunn3502 10 หลายเดือนก่อน

    Thank you so much for this very helpful tutorial ! 🙏🙏🙏

  • @truth-7380
    @truth-7380 2 ปีที่แล้ว +7

    hi, I am been programming for about 300 years,
    no just kidding 😁, for 30 years.
    I must say "well done sir"
    my question for you: where did you get your knowledge please? which books, or through experience and coworking with others?
    thank you for your accurate and professional videos.

    • @geekific
      @geekific  2 ปีที่แล้ว +7

      Hello :) Thank you, this really means a lot especially from someone like you!
      Concerning your question, it is actually a mix of everything there no particular reference or book that I stick to, I usually pick a certain topic and intensively research it before making any video just to make sure that everything that needs to be covered will actually be covered. Even if I already know a lot about this or that topic, I still do the research and try not to stick to one reference, or one perspective, this helps in covering a few gray areas in stuff I already know or areas that I didn't even knew existed!

    • @truth-7380
      @truth-7380 2 ปีที่แล้ว +1

      @@geekific
      👍

  • @onomatopeia891
    @onomatopeia891 ปีที่แล้ว +3

    Great video. Thanks for the clear explanation!

    • @geekific
      @geekific  ปีที่แล้ว

      Glad it was helpful!

  • @varshard0
    @varshard0 2 หลายเดือนก่อน +1

    Quick to the point and easy to understand. Kudo

  • @arash2229
    @arash2229 ปีที่แล้ว +1

    great explanation, thanks

  • @kennethcarvalho3684
    @kennethcarvalho3684 10 หลายเดือนก่อน

    Wow thank you sir for great explanation... This pattern always confused me but your video makes it clear.....

  • @abdurrahmanpektas9519
    @abdurrahmanpektas9519 2 ปีที่แล้ว +6

    very good explanation. Thank you for your effort.

    • @geekific
      @geekific  2 ปีที่แล้ว

      You are welcome! Glad it was helpful!

  • @Keras___
    @Keras___ ปีที่แล้ว +5

    Awesome, I finally understand how this pattern works, thanks.

  • @javiercozar840
    @javiercozar840 2 ปีที่แล้ว

    very very good explanation. Thanks so much

    • @geekific
      @geekific  2 ปีที่แล้ว

      Glad it helped!

  • @marcgonzalezsalo2255
    @marcgonzalezsalo2255 ปีที่แล้ว

    Really useful!!!!

  • @vengateshm2122
    @vengateshm2122 2 ปีที่แล้ว +1

    It was very helpful indeed

    • @geekific
      @geekific  2 ปีที่แล้ว

      Thanks man! Am glad it was :)

  • @golthishoping9656
    @golthishoping9656 28 วันที่ผ่านมา

    Thank you

  • @indranurzaman8733
    @indranurzaman8733 5 หลายเดือนก่อน +2

    Hi, thanks for great explanation.
    just wondering at 2:59 your Visitor Interface consists of methods with name void visit(Bank bank) , void visit(Company company) ... etc
    but jump in to your example at 3:25 , the method in Client concrete class(Bank, Restaurant, Resident) inside their method void accept(Visitor visitor) it become visitor.visitBank, visitor.visitRestaurant ... etc instead of just visit as previous Interface. could you explain why these two are different ?

  • @danielchandler955
    @danielchandler955 ปีที่แล้ว +4

    Thanks for the video, it's really helped 👍 It's interesting that for each concrete element you might need an individual method in the Visitor interface. I guess this would only be suitable if you don't expect too many concrete elements or they could largely be operated on the same?

    • @geekific
      @geekific  ปีที่แล้ว +3

      Glad it was helpful! True, the whole idea behind the visitor pattern is to place new behaviors into a separate class instead of trying to integrate them into existing classes.

  • @dylanbradshaw8158
    @dylanbradshaw8158 10 หลายเดือนก่อน

    AMAZING

  • @vladimirgorlin7510
    @vladimirgorlin7510 7 หลายเดือนก่อน

    Super!

  • @CanalRD
    @CanalRD 6 หลายเดือนก่อน +1

    I'm a bit confused by the open-closed principle. Here, we can modify the class ConcreteVisitor and the interface Visitor if we need to add new specific methods for the clients. But wouldn't we be breaking this principle? From my understanding of previous patterns, we added classes, so we didn't need to modify existing ones...

    • @basaryldrm5488
      @basaryldrm5488 3 หลายเดือนก่อน

      I was thinking the same thing.

  • @josetorrealba4644
    @josetorrealba4644 2 ปีที่แล้ว

    amazing explanation the only thing i would do is to separate the accept method from client interfae for interface segregation principle and single responsabilty apart all was amazing

    • @geekific
      @geekific  2 ปีที่แล้ว

      Thank you

    • @reallylordofnothing
      @reallylordofnothing 5 หลายเดือนก่อน

      is it possible that you can explain this further?

  • @ksaisko
    @ksaisko 2 ปีที่แล้ว

    I have a question about the method implemented in the ConcreteVisitor object. How can it access attribute from ElementA object in the visitA method?

    • @geekific
      @geekific  2 ปีที่แล้ว +1

      Hello! The visit methods implemented in the ConcreteVisitor class take concrete elements as parameter and not the interface, this way they will be able to access stuff specific to that element :) Hope this answers your question! Cheers!

  • @shaikchandbasha4692
    @shaikchandbasha4692 6 หลายเดือนก่อน

    this pattern is similar to sharing food with younger siblings. they always say I got less portion.
    you give food to them and ask them to choose your portion and give it to me.

  • @sidekick3rida
    @sidekick3rida ปีที่แล้ว

    Is there an example of where accept would be implemented differently for each Element?

    • @geekific
      @geekific  ปีที่แล้ว

      If you have pre-stuff specific to that element you want to do, yes... In this simple example we are just calling the visit method, and yet each time we call a different one...

  • @alyabouzaid6109
    @alyabouzaid6109 9 หลายเดือนก่อน

    Could you elaborate more on how not using the visitor pattern was breaking the open/closed principle? I still think that this wasn't the case since classes were already extendable without modifying them, which is the only concern of the open/closed principle.

    • @geekific
      @geekific  9 หลายเดือนก่อน +1

      In this particular example, if you were to change the "sendMail" functionality, you will have to open all the created classes and modify them.

  • @pgupta2124
    @pgupta2124 ปีที่แล้ว

    I still did not get it. If i need to change the way the mail is send for a resident, i'll need to go to the visitor and update, the same is true in case of the original design where i'll change the sendMail behaviour. If i am creating multiple visitors like send mail and another which is give promo, I'll need two different function in the client to call the correct visitor. How is this any different from the initial class structure?

    • @geekific
      @geekific  ปีที่แล้ว +2

      In the initial structure, if you want to modify the behavior of your classes (the 'sendMail' functionality in this case) you'll have to open and break each and every child class you have. After applying the Visitor pattern, the only change you need to make will be inside your visitor, your classes are now closed for modification but open for extension. Hope this helps!

  • @atrus3823
    @atrus3823 9 หลายเดือนก่อน +1

    This seems like it just moves the problem around. Isn't the Visitor interface now open for modification? Every time you want to add a new type of element, it needs to be changed, and so all concrete implementations need to be changed as well.

    • @geekific
      @geekific  9 หลายเดือนก่อน +1

      The centralization is key here. By "moving stuff around" we are now able to extract common behaviors and work based on a single source of truth mentality. Remember, design patterns are about organization and laying out a series of steps to follow, we are not trying to modify the core logic.

    • @atrus3823
      @atrus3823 9 หลายเดือนก่อน +1

      ​@@geekific Thank you for the reply, but I'm not sure you understood my comment. I wasn't talking about moving methods around, but moving the problem around. Specifically, you solve the violation of the open/closed principle in the Clients (you don't have to update the client classes every time you add new functionality), but you create a new violation of the open/closed principle in the Visitor interface: every time we add a new type of Client, we need to add a method to the Visitor interface, as well as all of the concrete Visitor classes.

    • @reallylordofnothing
      @reallylordofnothing 5 หลายเดือนก่อน

      @@atrus3823 thanks for raising this point. The goal shifting is indeed occurring. So clearly the tradeoffs need to be discussed before going ahead and over engineering something.

  • @sakuranooka
    @sakuranooka ปีที่แล้ว

    Why isn't the overloading mechanism able to resolve the client-type at runtime?

    • @geekific
      @geekific  ปีที่แล้ว

      Because we'll be passing the interface and not the implementation

  • @TechOnScreen
    @TechOnScreen ปีที่แล้ว

    can you build a project in which you could incorporate all the 23 design patterns.. that would give a better complete compiled understanding.. :)

    • @geekific
      @geekific  ปีที่แล้ว +2

      Great idea! Not easy to come up with though :P Will keep it in mind for future videos! Stay Tuned!

    • @TechOnScreen
      @TechOnScreen ปีที่แล้ว

      @@geekific turned on the bell icon :)

    • @IStMl
      @IStMl 9 หลายเดือนก่อน

      that project would need to be massive

  • @shuyinlam8541
    @shuyinlam8541 ปีที่แล้ว

    i find this weirdly similar to mediator pattern. both address the possibilities of invading dependencies' privacy and the object's single responsibility principle.
    obviously they are different in implementation. the mediator sits inside the class whereas visitor is nothing more than a function parameter being passed in.
    but on an abstract level i just find them awfully similar.

    • @geekific
      @geekific  ปีที่แล้ว +1

      Both are Behavioral Patterns concerned with communication and assignment of responsibilities between objects as the program is running. That is why you will find similarities :)

  • @mitchellsokol8811
    @mitchellsokol8811 ปีที่แล้ว +1

    Combining data with functionality is the whole point of OOP.. The "Single Responsiblity" principle is greatly misunderstood.

    • @geekific
      @geekific  ปีที่แล้ว +1

      Watch our video on SOLID principles here: th-cam.com/video/HoA6aZPR5K0/w-d-xo.html! Cheers :)

    • @CyberKinetiks
      @CyberKinetiks 7 หลายเดือนก่อน

      Same with open-close principle. As long as the declaration in abstract class remsins the same (namely, "sendMail()" remains the same, not renamed, no arguments or return values are added), changing the implementation is not a violation of O in SOLID. In fact, we put the method here so the logic corresponding to this object only would remain near it and unavailable to any other entities within the program.

    • @reallylordofnothing
      @reallylordofnothing 5 หลายเดือนก่อน

      agree with you, one thing the author doesn't address is that visitors can;t access the private data of each of the client implementations (visitables) and hence data has to be made public thus violating information hiding. visitor pattern is complex.

  • @DevendraMandan7
    @DevendraMandan7 ปีที่แล้ว

    To me Strategy pattern seems to be a better fit for the mail example..

    • @DevendraMandan7
      @DevendraMandan7 ปีที่แล้ว

      But i guess with this pattern we can have multiple types of visitors without modifying anything existing

    • @geekific
      @geekific  ปีที่แล้ว

      💪

  • @zahansafallwa3263
    @zahansafallwa3263 5 ชั่วโมงที่ผ่านมา

    Incomplete

  • @philippedoumet6073
    @philippedoumet6073 3 หลายเดือนก่อน

    are you lebanese?