Προς το περιεχόμενο

Java state pattern


Προτεινόμενες αναρτήσεις

Δημοσ.

Ακόμα δέν έχω προλάβει να διαβάσω Design Patterns - ξέρω μόνο αυτά που έχει το βιβλίο για την πιστοποίηση Java 8 - αλλά άν είχα να το λύσω θα κοιτούσα πρώτα εδώ:

 

https://www.tutorialspoint.com/design_pattern/state_pattern.htm

 

Δέν πρέπει να είναι δύσκολο πάντως.. 

Δημοσ.

Ευχαριστώ αλλά δε μπορώ να καταλάβω πως βγαίνει

 

Τί δεν καταλαβαίνεις και ευχαριστείς δηλαδή? 

Σου έδωσαν τα παιδιά πάνω το UML διάγραμμα και άμα googlαρεις State pattern θα βρείς κανα κατομμύριο έτοιμα παραδείγματα.. Αμα δέν ασχοληθείς λίγο δέν πρόκειται να βγεί ποτέ.. 

 

state_pattern_uml_diagram.jpg

 

Εχεις ένα interface State το οποίο γίνεται implementation από 2 κλάσεις: την On και την Off και το χρησιμοποιεί η κλάση Engine.. 

 

Στον κώδικά σου έχεις ένα άδειο interface State και στις κλάσεις σου On και Off τις void μεθόδους turnOn() και turnOff() με μοναδική παράμετρο ένα αντικείμενο τύπου Engine.. 

Ποιές θα είναι οι public abstract μέθοδοι στο interface State που υλοποιούν οι concrete κλάσεις On και Off??? 

 

Η κλάση Engine χρησιμοποιεί το interface State και για να το αλλάζει χρειάζεται ενα "pointer".. 

Κοίτα τη σειρά:  private State state = new Off();

Εχεις ένα αντικείμενο state τύπου State το οποίο όποτε αλλάζει κατάσταση αλλάζει και η κατάσταση της Engine σου.. Αρχικά είναι σε κατάσταση off.. Έχεις ακούσει ποτέ σου καμιά Μηχανή να είναι σε αρχική κατάσταση null? Όχι.. 

Πώς θα αλλάξει κατάσταση ο "pointer" σου state? Μα φυσικά μέσω της void μεθόδου changeState().. 

Επομένως κάτι λείπει εκεί μέσα.. 

Αν η μέθοδος ήταν changeState(State state) θα έπρεπε να βάλεις this.state=state;  γιατί η παράμετρος της μεθόδου έχει το ίδιο όνομα με το αντικείμενο που κάνεις αναφορά.. 

 

Για ποιό λόγο χρησιμοποιούμε το State pattern? 

Γιατί ο κώδικάς μας έχει πολυμορφική συμπεριφορά και έτσι είναι πιό δύσκολο να κάνουμε λάθος.. 

μπορούμε να προσθέσουμε όσες επιπλέον καταστάσεις θέλουμε.. 

δέν χρειάζεται να χρησιμοποιοήσουμε control flow statements.. 

και γενικά ο κώδικάς μας είναι πιό κατανοητός, ευκολοδιάβαστος και maintainable.. άλλο το δικό σου ασκησίδιο και άλλο να έχεις ένα project με εκατομμύρια γραμμές κώδικα..  

 

Τί δεν καταλαβαίνεις και ευχαριστείς δηλαδή? 

Σου έδωσαν τα παιδιά πάνω το UML διάγραμμα και άμα googlαρεις State pattern θα βρείς κανα κατομμύριο έτοιμα παραδείγματα.. Αμα δέν ασχοληθείς λίγο δέν πρόκειται να βγεί ποτέ.. 

 

state_pattern_uml_diagram.jpg

 

Εχεις ένα interface State το οποίο γίνεται implementation από 2 κλάσεις: την On και την Off και το χρησιμοποιεί η κλάση Engine.. 

 

Στον κώδικά σου έχεις ένα άδειο interface State και στις κλάσεις σου On και Off τις void μεθόδους turnOn() και turnOff() με μοναδική παράμετρο ένα αντικείμενο τύπου Engine.. 

Ποιές θα είναι οι public abstract μέθοδοι στο interface State που υλοποιούν οι concrete κλάσεις On και Off??? 

 

Η κλάση Engine χρησιμοποιεί το interface State και για να το αλλάζει χρειάζεται ενα "pointer".. 

Κοίτα τη σειρά:  private State state = new Off();

Εχεις ένα αντικείμενο state τύπου State το οποίο όποτε αλλάζει κατάσταση αλλάζει και η κατάσταση της Engine σου.. Αρχικά είναι σε κατάσταση off.. Έχεις ακούσει ποτέ σου καμιά Μηχανή να είναι σε αρχική κατάσταση null? Όχι.. 

Πώς θα αλλάξει κατάσταση ο "pointer" σου state? Μα φυσικά μέσω της void μεθόδου changeState().. 

Επομένως κάτι λείπει εκεί μέσα.. 

Αν η μέθοδος ήταν changeState(State state) θα έπρεπε να βάλεις this.state=state;  γιατί η παράμετρος της μεθόδου έχει το ίδιο όνομα με το αντικείμενο που κάνεις αναφορά.. 

 

Για ποιό λόγο χρησιμοποιούμε το State pattern? 

Γιατί ο κώδικάς μας έχει πολυμορφική συμπεριφορά και έτσι είναι πιό δύσκολο να κάνουμε λάθος.. 

μπορούμε να προσθέσουμε όσες επιπλέον καταστάσεις θέλουμε.. 

δέν χρειάζεται να χρησιμοποιοήσουμε control flow statements.. 

και γενικά ο κώδικάς μας είναι πιό κατανοητός, ευκολοδιάβαστος και maintainable.. άλλο το δικό σου ασκησίδιο και άλλο να έχεις ένα project με εκατομμύρια γραμμές κώδικα..  

 

  • Like 1
Δημοσ.

Να συμπληρωσω γιατι μπορεί να μπερδευει οτι

public class On {

 public void turnOn(Engine e) {  -- DO NOTHING }

}

αυτό γιατι οταν το state είναι On ουσιαστικά το turnOn δεν αλλάζει state

Δημοσ.

Εμένα πάντως δέν μου άρεσε καθόλου το στυλάκι αυτού που απάντησε.. δηλαδή είπε το παιδί ότι δέν καταλαβαίνει και τον έπιασε απο τα μούτρα και στην ουσία δέν του εξήγησε και τίποτε.. καλά τον κάνανε ban οι administrators.. 

Δημοσ. (επεξεργασμένο)


public class Engine {

private State state=new Off();

void changeState(State s)
{
this.state=s;
}

void turnOn()
{
state.turnOn(this);
}
void turnOff()
{
state.turnOff(this);
}
}

public interface State {
public void turnOn(Engine e);
public void turnOff(Engine e);
}

public class On implements State {

public void turnOn(Engine e){
System.out.println("Engine already turned on");
}

public void turnOff(Engine e){
e.changeState(new Off());
System.out.println("Turnoff engine");
}

}

public class Off implements State{

public void turnOn(Engine e){
e.changeState(new On());
System.out.println("Turnon engine");
}

public void turnOff(Engine e){
System.out.println("Engine already turned off");
}

}

 

Επεξ/σία από Aztec
  • Like 1
Δημοσ.
public class Engine {

    private State state=new Off();
    
    void changeState(State s)
    {
      this.state=s;        
    }
    
    void turnOn()
    {
      state.turnOn(this);
    }
    void turnOff()
    {
      state.turnOff(this);
    }
}

public interface State {
    public void turnOn(Engine e);
    public void turnOff(Engine e);
}

public class On implements State {
    
    public void turnOn(Engine e){
      System.out.println("Engine already turned on");  
    }
    
    public void turnOff(Engine e){
       e.changeState(new Off());
       System.out.println("Turnoff engine"); 
    }
    
}

public class Off implements State{
    
    public void turnOn(Engine e){
      e.changeState(new On());
      System.out.println("Turnon engine"); 
    }
    
    public void turnOff(Engine e){
      System.out.println("Engine already turned off");  
    }
    
}

Ευχαριστώ μας τα ζητάει στις εξετάσεις μας χωρις να τα αναφέρει στην τάξη και δεν τα γνωρίζω γι αυτό τα ανέβασα έχω ακόμη μία άσκηση με iterator pattern στο ίδιο στύλ. 

Δημοσ.

Δηλαδή άν διαβάσεις λίγο εδώ: https://www.tutorialspoint.com/design_pattern/iterator_pattern.htm  ή εδώ: https://sourcemaking.com/design_patterns/iterator  δέν μπορείς να το φτιάξεις?

 

Αν είσαι οπτικοακουστικός τύπος δές εδώ:  https://www.youtube.com/watch?v=VKIzUuMdmag

 

Έχεις 2 interfaces το Container και το Iterator.. Το Iterator χρησιμοποιείται για να έχεις σειριακό access στα αντικείμενα διαφορετικών Collection χωρίς να σε νοιάζει ή να φανερώνεται το εσωτερικό σχήμα οργάνωσής τους.. Το Container χρησιμοποιείται για να σου επιστρέφει το Iterator και να μπορείς να διαχειριστείς τα διαφορετικά σου Collections.. 

 

Give it a go και άν είσαι τόσο άσχετος/η ξαναέλα εδώ να στο φτιάξουμε να μην κλαίς.. 

τα δουλεύω άλλα πάντα κάτι κάνω λάθος και ζήτησα βοήθεια γιατί η φιλοσοφία του καθηγητή είναι ότι αν κάνω έστω κ ένα λάθος σ κάποια γραμμή κόβει όλη την άσκηση :/ 

Δημοσ.

Δηλαδή άν διαβάσεις λίγο εδώ: https://www.tutorialspoint.com/design_pattern/iterator_pattern.htm  ή εδώ: https://sourcemaking.com/design_patterns/iterator  δέν μπορείς να το φτιάξεις?

 

Αν είσαι οπτικοακουστικός τύπος δές εδώ:  https://www.youtube.com/watch?v=VKIzUuMdmag

 

Έχεις 2 interfaces το Container και το Iterator.. Το Iterator χρησιμοποιείται για να έχεις σειριακό access στα αντικείμενα διαφορετικών Collection χωρίς να σε νοιάζει ή να φανερώνεται το εσωτερικό σχήμα οργάνωσής τους.. Το Container χρησιμοποιείται για να σου επιστρέφει το Iterator και να μπορείς να διαχειριστείς τα διαφορετικά σου Collections.. 

 

Give it a go και άν είσαι τόσο άσχετος/η ξαναέλα εδώ να στο φτιάξουμε να μην κλαίς.. 

checkare μια please  :-)  :-D 

public interface Iterator {
 1) public Integer getNext();
 2)public boolean hasNext();
}

public interface ICollector{
  3)public Iterator getIterator();
}


public class ListIterator 4) implements Iterator {
   private Mylist alist;
   private int index= 0;
   private int size=-1; //δεν είμαι σίγουρος για -1 φαίνεται 
   public ListIterator(Mylist alist){
          this.alist=alist;
          size=this.getsize();
   }
   public Integer getNext(){
           return alist.getItem(index++);
  }
  public boolean hasNex(){
           return (index<size);
  }
}//τελος class ListIterator


public class Mylist 5) implements ICollector {

  private List<Integer> Integers=new ArrayList<Integer>;
  public Iterator getIterator(){
     6) return new ListIterator;
   }
}

 

Δημοσ.

 

checkare μια please  :-)  :-D

public interface Iterator {
 1)public Integer getNext();
 2)public boolean hasNext();
}

public interface ICollector{
  3)public Iterator getIterator();
}

public class ListIterator 4) implements Iterator {
   private Mylist alist;
   private int index= 0;
   private int size=-1; //δεν είμαι σίγουρος για -1 φαίνεται 
   7)public ListIterator(Mylist alist){
          this.alist=alist;
          size=this.getsize();
   }
   public Integer getNext(){
           return alist.getItem(index++);
  }
  public boolean hasNex(){
           return (index<size);
  }
}//τελος class ListIterator


public class Mylist 5) implements ICollector {

  private List<Integer> Integers=new ArrayList<Integer>;
  public Iterator getIterator(){
     6) return new ListIterator;
   }
}

 

 

Δες λιγο τα 6 και 7 και κατάλαβε γιατι αυτα τα δύο δεν συνδυάζονται και άρα to 6 που έχεις βάλει είναι λάθος

 

Τέλος δεν το έχεις γράψει ολοκληωμένο το προγραμμα και έχει λάθη αλλά οσον αφορά το ζητούμενο αυτο το θέμα εντόπισα

Δημοσ.

Άσχετα με το αν συνδυάζεται το 6 με το 7, όταν καλείς την getIterator με την υλοποίηση που έχεις κάνει απλά θα παίρνεις πίσω πάντα έναν κενό ListIterator.

 

Και μία ερώτηση , άλλαξε η ερώτηση του τοπικ? και τι είναι αυτά τα 1,2,6,7 τα ερωτηματικά απο την εικόνα που έχεις κάνει attach?

Δυσκολεύτηκα να καταλάβω τι θέλεις διαβάζοντας όλο το τοπικ

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...