Sabtu, 17 Desember 2016

EAS PPL Kelas C. Implementasi Memento Pattern : Undo Redo System

Kelompok:
- Rivaldo Alif Rachmansyah 5114100010
- Ivaldy Putra Lifiari            5114100105
- Wida Dwitiayasa               5114100155

MEMENTO DESIGN PATTERN


Memento Design Pattern adalah sebuah pattern yang digunakan untuk menyimpan suatu kondisi sebelumnya dari sebuah objek. 

Memento Pattern biasanya terdiri dari 3 class utama:

  1. Class Memento: Object yang akan disimpan dan memiliki isi yang berbeda-beda (bisa string, angka, status, boolean, dll)
  2. Class Originator: Class yang digunakan untuk melakukan set and get dari sebuah objek memento. Originator juga digunakan untuk membuat objek memento baru dan memasukkan value kedalam objek tersebut
  3. Class Caretaker: Memiliki sebuah  ArrayList yang berisi semua memento yang pernah tersimpan. Caretaker juga berfungsi untuk store and retrieve objek-objek memento yang tersimpan didalamnya

Berikut adalah Use Case Diagram dari Memento Design Pattern kali ini:


Berikut adalah Sequence Diagram dari Memento Design Pattern kali ini:






Berikut adalah Class Diagram dari Memento Design Pattern kali ini:


- Class Memento untuk menyimpan objek yang dijadikan sebagai memento
- Class Originator untuk membuat sebuah objek memento baru dan memberi objek tersebut sebuah value atau untuk mengambil objek memento yang sudah tersimpan 
- Class Caretaker untuk membuat array yang diisi semua memento yang telah dibuat 

Berikut adalah CRC dari Memento Design Pattern kami:

Berikut adalah Component dan Deployment diagram dari Memento Design Pattern kami:




Implementasi Design Pattern : Undo & Redo Pada Notepad
Terdapat 4 Class pada contoh implementasi kali ini, yaitu

Class Memento

1:  //Menyimpan objek sebagai memento  
2:    
3:  public class Memento {  
4:         
5:       // article adalah variabel yang akan disimpan didalam memento  
6:         
7:       private String article;  
8:    
9:      // Menyimpan article baru kedalam Object Memento  
10:         
11:       public Memento(String articleSave) { article = articleSave; }  
12:         
13:       // Mengembalikan value didalam variabel artikel  
14:         
15:       public String getSavedArticle() { return article; }  
16:         
17:  }  

Penjelasan:
- fungsi Memento() digunakan untuk menyimpan value / input baru kedalam Memento
- fungsi getSavedArticle() digunakan untuk return value Memento kedalam variabel article

Class Originator

1:  // Membuat object Memento baru
2:  
3:  public class Originator{  
4:         
5:       private String article;  
6:    
7:       // memasukkan input pada variabel article yang baru
8:         
9:       public void set(String newArticle) {   
10:            System.out.println("From Originator: Current Version of Article\n"+newArticle+ "\n");  
11:         this.article = newArticle;   
12:       }  
13:    
14:       // Menciptakan Memento baru yang berisi variabel article
15:         
16:       public Memento storeInMemento() {   
17:         System.out.println("From Originator: Saving to Memento");  
18:         return new Memento(article);   
19:       }  
20:           
21:       // Mengambil variabel article yang sekarang sedang disimpan didalam Memento
22:         
23:       public String restoreFromMemento(Memento memento) {  
24:                
25:            article = memento.getSavedArticle();   
26:             
27:            System.out.println("From Originator: Previous Article Saved in Memento\n"+article + "\n");  
28:              
29:            return article;  
30:           
31:       }  
32:         
33:  }  

Penjelasan:
fungsi set() digunakan untuk memasukan input pada variabel article yang baru
- fungsi storeInMemento() digunakan untuk menciptakan Memento baru untuk menyimpan variabel article
- fungsi restoreFromMemento() digunakan untuk mengambil variabel article yang disimpan didalam Memento

Class Caretaker

1:  // Membuat array untuk menyimpan Memento 
2:    
3:  import java.util.ArrayList;  
4:    
5:  class Caretaker {  
6:      
7:       // ArrayList tempat tersimpannya Memento
8:         
9:       ArrayList<Memento> savedArticles = new ArrayList<Memento>();  
10:    
11:       // Menambah Memento baru kedalam ArrayList
12:         
13:       public void addMemento(Memento m) { savedArticles.add(m); }  
14:      
15:       // Memanggil Memento yang diminta dari dalam ArrayList
16:         
17:       public Memento getMemento(int index) { return savedArticles.get(index); }  
18:  }   

Penjelasan:
- Variabel SavedArticles adalah variabel bertipe ArrayList tempat tersimpannya Memento
- Fungsi addMemento() digunakan untuk memasukkan Memento baru kedalam ArrayList
- Fungsi getMemento() digunakan untuk memanggil Memento yang diminta dari dalam ArrayList

Class TestMemento

1:  // Tampilan Implementasi Memento
2:  // import Java  
3:  import java.awt.event.ActionEvent;  
4:  import java.awt.event.ActionListener;  
5:    
6:  import javax.swing.*;  
7:    
8:  public class TestMemento extends JFrame{  
9:    public static void main(String[] args) {  
10:         // Constructor Class TestMemento
11:         new TestMemento();  
12:        
13:    }  
14:      
15:    private JButton saveBut, undoBut, redoBut;  
16:      
17:    // JTextArea(rows, columns)  
18:      
19:    private JTextArea theArticle = new JTextArea(40,60);  
20:      
21:    // ---------------------------------------------  
22:      
23:    // Menciptakan variabel caretaker yang berisi ArrayList     
24:    // dapat digunakan untuk add and retrieve article
25:    // dari dalam ArrayList  
26:      
27:    Caretaker caretaker = new Caretaker();  
28:    
29:    // Variabel originator digunakan untuk memasukkan nilai
30:    // input kedalam article, menciptakan Memento baru, dan 
31:    // mengambil article yang disimpan didalam Memento
32:      
33:    Originator originator = new Originator();  
34:    // saveFile = total isi array; currentArticle = lokasi sekararang didalam array  
35:    int saveFiles = 0, currentArticle = 0;  
36:      
37:    // ---------------------------------------------  
38:      
39:    public TestMemento(){  
40:           
41:   
42:         // Memunculkan GUI  
43:           
44:         this.setSize(750,780); //size windows GUI 
45:         this.setTitle("Memento Design Pattern");  //judul GUI
46:         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
47:           
48:         JPanel panel1 = new JPanel();  
49:           
50:         // memberi label berjudul "Article" untuk ditampilkan  
51:           
52:         panel1.add(new JLabel("Article"));  
53:           
54:         // memberi JTextArea untuk article
55:           
56:         panel1.add(theArticle);  
57:           
58:         // Menambah 3 tombol pada tampilan & ButtonListener  
59:           
60:         ButtonListener saveListener = new ButtonListener();  
61:         ButtonListener undoListener = new ButtonListener();  
62:         ButtonListener redoListener = new ButtonListener();  
63:           
64:         saveBut = new JButton("Save"); //tombol save 
65:         saveBut.addActionListener(saveListener);  
66:           
67:         undoBut = new JButton("Undo"); //tombol undo
68:         undoBut.addActionListener(undoListener);  
69:           
70:         redoBut = new JButton("Redo"); //tombol redo
71:         redoBut.addActionListener(redoListener);  
72:           
73:         panel1.add(saveBut);  //menampilkan tombol save
74:         panel1.add(undoBut);  //menampilkan tombol undo
75:         panel1.add(redoBut);  //menampilkan tombol redo
76:           
77:         // Menampilkan panel1 pada layar  
78:           
79:         this.add(panel1);  
80:           
81:         this.setVisible(true);  
82:           
83:    }  
84:      
85:    class ButtonListener implements ActionListener {  
86:    
87:            public void actionPerformed(ActionEvent e) {  
88:                 // Jika user menekan tombol SAVE  
89:                 if(e.getSource() == saveBut){  
90:                        
91:                      // Mendapatkan text telah ditulis
92:                        
93:                      String textInTextArea = theArticle.getText();  
94:                        
95:                      // Memasukkan text sebagai value dari objek Memento  
96:                        
97:                      originator.set(textInTextArea);  
98:                        
99:                      // Memasukkan article baru kedalam ArrayList
100:                        
101:                      caretaker.addMemento( originator.storeInMemento() );  
102:                        
103:                      // saveFiles menunjukan berapa article yang telah disimpan  
104:                      // currentArticle menunjukan nomor article sekarang
105:                        
106:                      saveFiles++;  
107:                      currentArticle++;  
108:                        
109:                      System.out.println("Save Files " + saveFiles);  
110:                        
111:                      // Membuat tombol UNDO dapat ditekan 
112:                        
113:                      undoBut.setEnabled(true);  
114:                        
115:                 } else   
116:                      // Jika user menekan tombol UNDO
117:                      if(e.getSource() == undoBut){  
118:                             
119:                           if(currentArticle >= 1){  
120:                                  
121:                                // variabel currentArticle dikurangi agar dapat di undo  
122:                                  
123:                                currentArticle--;  
124:                                  
125:                                // Memanggil article dengan index yang sama dengan variable currentArticle
126:                             
127:                                String textBoxString = originator.restoreFromMemento( caretaker.getMemento(currentArticle) );  
128:                                  
129:                                theArticle.setText(textBoxString);  
130:                                  
131:                                // Membuat tombol REDO dapat ditekan 
132:                                  
133:                                redoBut.setEnabled(true);  
134:                             
135:                           } else {  
136:                                  
137:                                // Tombol UNDO menjadi tidak dapat ditekan 
138:                                  
139:                                undoBut.setEnabled(false);  
140:                                  
141:                           }  
142:                             
143:                      } else  
144:                           // Jika user menekan tombol REDO
145:                           if(e.getSource() == redoBut){  
146:                             
147:                           if((saveFiles - 1) > currentArticle){  
148:                                  
149:                                // variabel currentArticle ditambah agar dapat di undo  
150:                                  
151:                                currentArticle++;  
152:                                  
153:                                // Memanggil article dengan index yang sama dengan variable currentArticle  
154:                             
155:                                String textBoxString = originator.restoreFromMemento( caretaker.getMemento(currentArticle) );  
156:                                  
157:                                theArticle.setText(textBoxString);  
158:                                  
159:                                // Membuat tombol UNDO dapat ditekan   
160:                                  
161:                                undoBut.setEnabled(true);  
162:                             
163:                           } else {  
164:                                  
165:                                // Tombol REDO menjadi tidak dapat ditekan 
166:                                  
167:                                redoBut.setEnabled(false);  
168:                                  
169:                           }  
170:                             
171:                      }  
172:                   
173:            }  
174:              
175:       }  
176:      
177:  }


Hasil Output 
Ketika menekan tombol Save, input pertama (tes awal) langsung disimpan kedalam memento sebagai memento 1 

Ketika menekan tombol Save lagi, input kedua (tes akhir) langsung disimpan kedalam memento sebagai memento 2

Ketika menekan tombol Undo, user yang sedang berada di array kedua, dipindah ke array pertama dan memuncul kan memento pertama (tes awal)

Ketika menekan tombol Redo, user yang sedang berada di array pertama, dipindah ke array kedua dan memuncul kan memento kedua (tes akhir)