This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
java:interface_implementation [2017/03/31 13:14] gthanos [SimpleTimer] |
java:interface_implementation [2017/03/31 14:13] gthanos |
||
---|---|---|---|
Line 5: | Line 5: | ||
Σε συνέχεια του προηγούμενου παραδείγματος θα επιχειρήσουμε να δημιουργήσουμε δύο διαφορετικές κλάσεις που υλοποιούν το συγκεκριμένο //interface//. Οι κλάσεις αυτές είναι **SimpleTimer** και **StartStopTimer**. Και οι δύο κλάσεις παρέχουν την ίδια λειτουργικότητα. | Σε συνέχεια του προηγούμενου παραδείγματος θα επιχειρήσουμε να δημιουργήσουμε δύο διαφορετικές κλάσεις που υλοποιούν το συγκεκριμένο //interface//. Οι κλάσεις αυτές είναι **SimpleTimer** και **StartStopTimer**. Και οι δύο κλάσεις παρέχουν την ίδια λειτουργικότητα. | ||
- | ===== SimpleTimer ===== | + | ===== ArrayStack ===== |
- | <code java SimpleTimer.java> | + | <code java ArrayStack.java> |
- | class SimpleTimer implements Timer { | + | public class ArrayStack implements Stack { |
- | private long start_time, duration; | + | public int capacity; |
- | private boolean running = false; | + | public Object []array; |
- | + | public int size; | |
- | public void setTimer(int seconds) { | + | |
- | duration = seconds * 1000; | + | |
- | } | + | |
| | ||
- | public boolean startTimer() { | + | public ArrayStack() { |
- | Date now = new Date(); | + | this(256); |
- | if(duration > 0) { | + | |
- | start_time = now.getTime(); | + | |
- | running = true; | + | |
- | } | + | |
- | else { | + | |
- | running = false; | + | |
- | } | + | |
- | return running; | + | |
} | } | ||
| | ||
- | public void stopTimer() { | + | public ArrayStack(int capacity) { |
- | Date now = new Date(); | + | array = new Object[capacity]; |
- | if( running && now.getTime() > start_time) | + | this.capacity = capacity; |
- | duration -= now.getTime() - start_time; | + | size = 0; |
- | running = false; | + | |
} | } | ||
| | ||
- | public boolean isRunning() { | + | public int size() { |
- | return running; | + | return size; |
} | } | ||
| | ||
- | public boolean hasExpired() { | + | public void push(Object o) { |
- | Date now = new Date(); | + | |
- | if( (running && now.getTime() - start_time >= duration) || duration <= 0 ) { | + | if( size >= capacity-1 ) { |
- | start_time = 0L; | + | capacity *= 2; |
- | duration = 0L; | + | Object []newArray = new Object[capacity]; |
- | running = false; | + | for(int i=0; i<array.length; i++) |
- | return true; | + | newArray[i] = array[i]; |
+ | array = newArray; | ||
+ | newArray = null; | ||
} | } | ||
- | return false; | + | array[size++] = o; |
} | } | ||
| | ||
+ | public Object pop() { | ||
+ | return array[--size]; | ||
+ | } | ||
+ | | ||
+ | public Object top() { | ||
+ | return array[size-1]; | ||
+ | } | ||
+ | | ||
+ | public String toString() { | ||
+ | String str = "@@@@@@@@ - Stack - @@@@@@@@\n"; | ||
+ | for(int i=size-1; i>=0; i--) | ||
+ | str += array[i].toString()+"\n"; | ||
+ | return str + "@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"; | ||
+ | } | ||
} | } | ||
</code> | </code> | ||
- | ===== StartStopTimer ===== | + | ===== LinkedStack ===== |
- | <code java StartStopTimer.java> | + | <code java LinkedStack.java> |
- | class StartStop implements Timer { | + | class LinkedNode { |
- | private long start_time, duration; | + | private Object o; |
- | ArrayList starts = new ArrayList(); | + | private LinkedNode next; |
- | ArrayList stops = new ArrayList(); | + | |
- | private boolean running = false; | + | public LinkedNode(LinkedNode nxt, Object e) { |
+ | next = nxt; | ||
+ | o = e; | ||
+ | } | ||
+ | |||
+ | public LinkedNode(Object e) { | ||
+ | this(null, e); | ||
+ | } | ||
+ | |||
+ | public Object getElement() { return o; } | ||
+ | public LinkedNode getNext() { return next; } | ||
+ | |||
+ | public void setElement(Object e) { o = e; } | ||
+ | public void setNext(LinkedNode node) { next = node; } | ||
+ | } | ||
- | public void setTimer(int seconds) { | + | public class LinkedStack implements Stack { |
- | duration = seconds * 1000; | + | int size; |
+ | LinkedNode head; | ||
+ | |||
+ | public LinkedStack() { | ||
+ | size=0; | ||
+ | head = null; | ||
} | } | ||
- | public boolean startTimer() { | + | |
- | long now = new Date().getTime(); | + | public int size() { |
- | if(!running) { | + | return size; |
- | starts.add(now); | + | |
- | running = true; | + | |
- | } | + | |
- | return running; | + | |
} | } | ||
- | public void stopTimer() { | + | |
- | long now = new Date().getTime(); | + | public void push(Object o) { |
- | if(running) { | + | // the following is OK even if head == null. |
- | stops.add(now); | + | head = new LinkedNode(head, o); |
- | running = false; | + | size++; |
- | } | + | |
} | } | ||
- | public boolean isRunning() { | + | |
- | return running; | + | public Object pop() { |
+ | LinkedNode pN = head; | ||
+ | head = head.getNext(); | ||
+ | size--; | ||
+ | return pN.getElement(); | ||
} | } | ||
| | ||
- | public boolean hasExpired() { | + | public Object top() { |
- | if( !running ) | + | return head; |
- | return running; | + | } |
- | long runtime = 0L; | + | |
- | for(int i=0; i<stops.size(); i++) { | + | public String toString() { |
- | runtime += (long)((Long)stops.get(i) - (Long)starts.get(i)); | + | String str = "@@@@@@@@ - Stack - @@@@@@@@\n"; |
- | } | + | LinkedNode curr = head; |
- | long now = new Date().getTime(); | + | while(curr != null) |
- | runtime += now - (Long)starts.get(stops.size()); | + | str += curr.getElement().toString(); |
- | if( running && runtime > duration ) { | + | return str + "@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"; |
- | start_time = 0; | + | |
- | duration = 0; | + | |
- | running = false; | + | |
- | return true; | + | |
- | } | + | |
- | return false; | + | |
} | } | ||
} | } | ||
</code> | </code> | ||
- | Παραπάνω έχουμε υλοποιήσει το συγκεκριμένο //interface// μέσα από δύο διαφορετικές κλάσεις. Αν και η υλοποίηση των κλάσεων διαφέρει σημαντικά, η λειτουργικότητα που παρέχουν είναι ισοδύναμη. Μπορείτε να χρησιμοποιήσετε οποιαδήποτε από της δύο κλάσεις για να εξυπηρετήσετε τη λειτουργικότητα του //interface// **Timer** σε ένα πρόγραμμα. | + | Παραπάνω έχουμε υλοποιήσει το συγκεκριμένο //interface// μέσα από δύο διαφορετικές κλάσεις. Αν και η υλοποίηση των κλάσεων διαφέρει σημαντικά, η λειτουργία τους είναι κοινή. Μπορείτε να χρησιμοποιήσετε οποιαδήποτε από της δύο κλάσεις για να εξυπηρετήσετε τη λειτουργικότητα του //interface// **Stack** σε ένα πρόγραμμα. |
| Προηγούμενο : [[ :java:interface_implementation | Υλοποίηση του interface ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ :java:interface_as_data_type | Το interface ως τύπος δεδομένων ]] | | | Προηγούμενο : [[ :java:interface_implementation | Υλοποίηση του interface ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ :java:interface_as_data_type | Το interface ως τύπος δεδομένων ]] | | ||