टी एल; डॉ: आप पूर्ववत समर्थन करते हैं और कमान और मेमेंटो पैटर्न (Design Patterns - Gama et. al) को लागू करने से कार्यों को फिर से कर सकते हैं।
मेमेंटो पैटर्न
यह सरल पैटर्न आप एक वस्तु के राज्यों को बचाने के लिए अनुमति देता है। बस ऑब्जेक्ट को एक नई कक्षा में लपेटें और जब भी उसका राज्य बदल जाए, इसे अपडेट करें।
public class Memento
{
MyObject myObject;
public MyObject getState()
{
return myObject;
}
public void setState(MyObject myObject)
{
this.myObject = myObject;
}
}
कमान पैटर्न
कमान पैटर्न मूल वस्तु और स्मृति चिन्ह वस्तु है, जो हम एक पूर्ववत् के मामले में की जरूरत है (कि हम पूर्ववत करें/फिर समर्थन करना चाहते हैं) संग्रहीत करता है।इसके अलावा, 2 तरीकों परिभाषित कर रहे हैं:
- निष्पादित: आदेश
- unExecute कार्यान्वित: आदेश को हटा
कोड:
public abstract class Command
{
MyObject myObject;
Memento memento;
public abstract void execute();
public abstract void unExecute();
}
तार्किक "को परिभाषित क्रियाएं "जो कमांड का विस्तार करती हैं (उदाहरण के लिए सम्मिलित करें):
public class InsertCharacterCommand extends Command
{
//members..
public InsertCharacterCommand()
{
//instantiate
}
@Override public void execute()
{
//create Memento before executing
//set new state
}
@Override public void unExecute()
{
this.myObject = memento.getState()l
}
}
लागू करने पैटर्न:
यह अंतिम चरण पूर्ववत करें/फिर व्यवहार को परिभाषित करता। वे मूल विचार आदेशों का एक ढेर स्टोर करना है जो आदेशों की इतिहास-सूची के रूप में कार्य करता है। फिर से समर्थन करने के लिए, जब भी एक पूर्ववत आदेश लागू होता है तो आप द्वितीयक सूचक रख सकते हैं। ध्यान दें कि जब भी कोई नई वस्तु डाली जाती है, तो उसके वर्तमान स्थिति के बाद सभी आदेश हटा दिए जाते हैं; कि deleteElementsAfterPointer
विधि द्वारा प्राप्त किया गया है नीचे परिभाषित:
private int undoRedoPointer = -1;
private Stack<Command> commandStack = new Stack<>();
private void insertCommand()
{
deleteElementsAfterPointer(undoRedoPointer);
Command command =
new InsertCharacterCommand();
command.execute();
commandStack.push(command);
undoRedoPointer++;
}
private void deleteElementsAfterPointer(int undoRedoPointer)
{
if(commandStack.size()<1)return;
for(int i = commandStack.size()-1; i > undoRedoPointer; i--)
{
commandStack.remove(i);
}
}
private void undo()
{
Command command = commandStack.get(undoRedoPointer);
command.unExecute();
undoRedoPointer--;
}
private void redo()
{
if(undoRedoPointer == commandStack.size() - 1)
return;
undoRedoPointer++;
Command command = commandStack.get(undoRedoPointer);
command.execute();
}
निष्कर्ष:
क्या इस डिजाइन शक्तिशाली बनाता है तथ्य यह है कि आप (Command
वर्ग का विस्तार करके) के रूप में आप की तरह के रूप में कई आदेशों जोड़ सकते हैं जैसे , RemoveCommand
, UpdateCommand
और इसी तरह से। इसके अलावा, एक ही पैटर्न किसी भी प्रकार के ऑब्जेक्ट पर लागू होता है, जिससे विभिन्न उपयोग मामलों में पुन: प्रयोज्य और संशोधित बनाया जाता है।
स्रोत
2017-04-02 16:40:32
अंतर्निहित पूर्ववत समर्थन पर नज़र रखना सुनिश्चित करें; मैंने इसका कभी भी उपयोग नहीं किया है और मुझे इसके लिए स्विंग ट्यूटोरियल नहीं मिल रहा है, लेकिन [यहां] (http://docs.oracle.com/javase/6/docs/api/javax/swing/undo/UndoManager.html) प्रबंधक है। –