<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDesign_Pattern%2FMemento_Pattern</id>
		<title>Java/Design Pattern/Memento Pattern - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDesign_Pattern%2FMemento_Pattern"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Design_Pattern/Memento_Pattern&amp;action=history"/>
		<updated>2026-04-22T02:15:28Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Design_Pattern/Memento_Pattern&amp;diff=7795&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Design_Pattern/Memento_Pattern&amp;diff=7795&amp;oldid=prev"/>
				<updated>2010-06-01T06:50:42Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:50, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Design_Pattern/Memento_Pattern&amp;diff=7794&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Design_Pattern/Memento_Pattern&amp;diff=7794&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:45Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Memento Pattern 2 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//[C] 2002 Sun Microsystems, Inc.---&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
public class RunMementoPattern {&lt;br /&gt;
  public static void main(String[] arguments) {&lt;br /&gt;
    System.out.println(&amp;quot;Example for the Memento pattern&amp;quot;);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    System.out&lt;br /&gt;
        .println(&amp;quot;This example will use the AddressBook to demonstrate&amp;quot;);&lt;br /&gt;
    System.out&lt;br /&gt;
        .println(&amp;quot; how a Memento can be used to save and restore state.&amp;quot;);&lt;br /&gt;
    System.out&lt;br /&gt;
        .println(&amp;quot;The AddressBook has an inner class, AddressBookMemento,&amp;quot;);&lt;br /&gt;
    System.out&lt;br /&gt;
        .println(&amp;quot; that is used to store the AddressBook state... in this&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot; case, its internal list of contacts.&amp;quot;);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    System.out.println(&amp;quot;Creating the AddressBook&amp;quot;);&lt;br /&gt;
    AddressBook book = new AddressBook();&lt;br /&gt;
    System.out.println(&amp;quot;Adding Contact entries for the AddressBook&amp;quot;);&lt;br /&gt;
    book.addContact(new ContactImpl(&amp;quot;Peter&amp;quot;, &amp;quot;Taggart&amp;quot;, &amp;quot;Commander&amp;quot;,&lt;br /&gt;
        &amp;quot;NSEA Protector&amp;quot;, new AddressImpl()));&lt;br /&gt;
    book.addContact(new ContactImpl(&amp;quot;Tawny&amp;quot;, &amp;quot;Madison&amp;quot;, &amp;quot;Lieutenant&amp;quot;,&lt;br /&gt;
        &amp;quot;NSEA Protector&amp;quot;, new AddressImpl()));&lt;br /&gt;
    book.addContact(new ContactImpl(&amp;quot;Dr.&amp;quot;, &amp;quot;Lazarus&amp;quot;, &amp;quot;Dr.&amp;quot;,&lt;br /&gt;
        &amp;quot;NSEA Protector&amp;quot;, new AddressImpl()));&lt;br /&gt;
    book.addContact(new ContactImpl(&amp;quot;Tech Sargent&amp;quot;, &amp;quot;Chen&amp;quot;, &amp;quot;Tech Sargent&amp;quot;,&lt;br /&gt;
        &amp;quot;NSEA Protector&amp;quot;, new AddressImpl()));&lt;br /&gt;
    System.out.println(&amp;quot;Contacts added. Current Contact list:&amp;quot;);&lt;br /&gt;
    System.out.println(book);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    System.out.println(&amp;quot;Creating a Memento for the address book&amp;quot;);&lt;br /&gt;
    Object memento = book.getMemento();&lt;br /&gt;
    System.out&lt;br /&gt;
        .println(&amp;quot;Now that a Memento exists, it can be used to restore&amp;quot;);&lt;br /&gt;
    System.out&lt;br /&gt;
        .println(&amp;quot; the state of this AddressBook object, or to set the&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot; state of a new AddressBook.&amp;quot;);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    System.out.println(&amp;quot;Creating new entries for the AddressBook&amp;quot;);&lt;br /&gt;
    book.removeAllContacts();&lt;br /&gt;
    book.addContact(new ContactImpl(&amp;quot;Jason&amp;quot;, &amp;quot;Nesmith&amp;quot;, &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;Actor&amp;quot;s Guild&amp;quot;, new AddressImpl()));&lt;br /&gt;
    book.addContact(new ContactImpl(&amp;quot;Gwen&amp;quot;, &amp;quot;DeMarco&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;Actor&amp;quot;s Guild&amp;quot;,&lt;br /&gt;
        new AddressImpl()));&lt;br /&gt;
    book.addContact(new ContactImpl(&amp;quot;Alexander&amp;quot;, &amp;quot;Dane&amp;quot;, &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;Actor&amp;quot;s Guild&amp;quot;, new AddressImpl()));&lt;br /&gt;
    book.addContact(new ContactImpl(&amp;quot;Fred&amp;quot;, &amp;quot;Kwan&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;Actor&amp;quot;s Guild&amp;quot;,&lt;br /&gt;
        new AddressImpl()));&lt;br /&gt;
    System.out.println(&amp;quot;New Contacts added. Current Contact list:&amp;quot;);&lt;br /&gt;
    System.out.println(book);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    System.out&lt;br /&gt;
        .println(&amp;quot;Using the Memento object to restore the AddressBook&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot; to its original state.&amp;quot;);&lt;br /&gt;
    book.setMemento(memento);&lt;br /&gt;
    System.out.println(&amp;quot;AddressBook restored. Current Contact list:&amp;quot;);&lt;br /&gt;
    System.out.println(book);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
interface Contact extends Serializable {&lt;br /&gt;
  public static final String SPACE = &amp;quot; &amp;quot;;&lt;br /&gt;
  public String getFirstName();&lt;br /&gt;
  public String getLastName();&lt;br /&gt;
  public String getTitle();&lt;br /&gt;
  public String getOrganization();&lt;br /&gt;
  public void setFirstName(String newFirstName);&lt;br /&gt;
  public void setLastName(String newLastName);&lt;br /&gt;
  public void setTitle(String newTitle);&lt;br /&gt;
  public void setOrganization(String newOrganization);&lt;br /&gt;
}&lt;br /&gt;
interface Address extends Serializable {&lt;br /&gt;
  public static final String EOL_STRING = System&lt;br /&gt;
      .getProperty(&amp;quot;line.separator&amp;quot;);&lt;br /&gt;
  public static final String SPACE = &amp;quot; &amp;quot;;&lt;br /&gt;
  public static final String COMMA = &amp;quot;,&amp;quot;;&lt;br /&gt;
  public String getType();&lt;br /&gt;
  public String getDescription();&lt;br /&gt;
  public String getStreet();&lt;br /&gt;
  public String getCity();&lt;br /&gt;
  public String getState();&lt;br /&gt;
  public String getZipCode();&lt;br /&gt;
  public void setType(String newType);&lt;br /&gt;
  public void setDescription(String newDescription);&lt;br /&gt;
  public void setStreet(String newStreet);&lt;br /&gt;
  public void setCity(String newCity);&lt;br /&gt;
  public void setState(String newState);&lt;br /&gt;
  public void setZipCode(String newZip);&lt;br /&gt;
}&lt;br /&gt;
class ContactImpl implements Contact {&lt;br /&gt;
  private String firstName;&lt;br /&gt;
  private String lastName;&lt;br /&gt;
  private String title;&lt;br /&gt;
  private String organization;&lt;br /&gt;
  private Address address;&lt;br /&gt;
  public ContactImpl() {&lt;br /&gt;
  }&lt;br /&gt;
  public ContactImpl(String newFirstName, String newLastName,&lt;br /&gt;
      String newTitle, String newOrganization, Address newAddress) {&lt;br /&gt;
    firstName = newFirstName;&lt;br /&gt;
    lastName = newLastName;&lt;br /&gt;
    title = newTitle;&lt;br /&gt;
    organization = newOrganization;&lt;br /&gt;
    address = newAddress;&lt;br /&gt;
  }&lt;br /&gt;
  public String getFirstName() {&lt;br /&gt;
    return firstName;&lt;br /&gt;
  }&lt;br /&gt;
  public String getLastName() {&lt;br /&gt;
    return lastName;&lt;br /&gt;
  }&lt;br /&gt;
  public String getTitle() {&lt;br /&gt;
    return title;&lt;br /&gt;
  }&lt;br /&gt;
  public String getOrganization() {&lt;br /&gt;
    return organization;&lt;br /&gt;
  }&lt;br /&gt;
  public Address getAddress() {&lt;br /&gt;
    return address;&lt;br /&gt;
  }&lt;br /&gt;
  public void setFirstName(String newFirstName) {&lt;br /&gt;
    firstName = newFirstName;&lt;br /&gt;
  }&lt;br /&gt;
  public void setLastName(String newLastName) {&lt;br /&gt;
    lastName = newLastName;&lt;br /&gt;
  }&lt;br /&gt;
  public void setTitle(String newTitle) {&lt;br /&gt;
    title = newTitle;&lt;br /&gt;
  }&lt;br /&gt;
  public void setOrganization(String newOrganization) {&lt;br /&gt;
    organization = newOrganization;&lt;br /&gt;
  }&lt;br /&gt;
  public void setAddress(Address newAddress) {&lt;br /&gt;
    address = newAddress;&lt;br /&gt;
  }&lt;br /&gt;
  public String toString() {&lt;br /&gt;
    return firstName + &amp;quot; &amp;quot; + lastName;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class AddressImpl implements Address {&lt;br /&gt;
  private String type;&lt;br /&gt;
  private String description;&lt;br /&gt;
  private String street;&lt;br /&gt;
  private String city;&lt;br /&gt;
  private String state;&lt;br /&gt;
  private String zipCode;&lt;br /&gt;
  public AddressImpl() {&lt;br /&gt;
  }&lt;br /&gt;
  public AddressImpl(String newDescription, String newStreet, String newCity,&lt;br /&gt;
      String newState, String newZipCode) {&lt;br /&gt;
    description = newDescription;&lt;br /&gt;
    street = newStreet;&lt;br /&gt;
    city = newCity;&lt;br /&gt;
    state = newState;&lt;br /&gt;
    zipCode = newZipCode;&lt;br /&gt;
  }&lt;br /&gt;
  public String getType() {&lt;br /&gt;
    return type;&lt;br /&gt;
  }&lt;br /&gt;
  public String getDescription() {&lt;br /&gt;
    return description;&lt;br /&gt;
  }&lt;br /&gt;
  public String getStreet() {&lt;br /&gt;
    return street;&lt;br /&gt;
  }&lt;br /&gt;
  public String getCity() {&lt;br /&gt;
    return city;&lt;br /&gt;
  }&lt;br /&gt;
  public String getState() {&lt;br /&gt;
    return state;&lt;br /&gt;
  }&lt;br /&gt;
  public String getZipCode() {&lt;br /&gt;
    return zipCode;&lt;br /&gt;
  }&lt;br /&gt;
  public void setType(String newType) {&lt;br /&gt;
    type = newType;&lt;br /&gt;
  }&lt;br /&gt;
  public void setDescription(String newDescription) {&lt;br /&gt;
    description = newDescription;&lt;br /&gt;
  }&lt;br /&gt;
  public void setStreet(String newStreet) {&lt;br /&gt;
    street = newStreet;&lt;br /&gt;
  }&lt;br /&gt;
  public void setCity(String newCity) {&lt;br /&gt;
    city = newCity;&lt;br /&gt;
  }&lt;br /&gt;
  public void setState(String newState) {&lt;br /&gt;
    state = newState;&lt;br /&gt;
  }&lt;br /&gt;
  public void setZipCode(String newZip) {&lt;br /&gt;
    zipCode = newZip;&lt;br /&gt;
  }&lt;br /&gt;
  public String toString() {&lt;br /&gt;
    return street + EOL_STRING + city + COMMA + SPACE + state + SPACE&lt;br /&gt;
        + zipCode + EOL_STRING;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class AddressBook {&lt;br /&gt;
  private ArrayList contacts = new ArrayList();&lt;br /&gt;
  public Object getMemento() {&lt;br /&gt;
    return new AddressBookMemento(contacts);&lt;br /&gt;
  }&lt;br /&gt;
  public void setMemento(Object object) {&lt;br /&gt;
    if (object instanceof AddressBookMemento) {&lt;br /&gt;
      AddressBookMemento memento = (AddressBookMemento) object;&lt;br /&gt;
      contacts = memento.state;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  private class AddressBookMemento {&lt;br /&gt;
    private ArrayList state;&lt;br /&gt;
    private AddressBookMemento(ArrayList contacts) {&lt;br /&gt;
      this.state = contacts;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public AddressBook() {&lt;br /&gt;
  }&lt;br /&gt;
  public AddressBook(ArrayList newContacts) {&lt;br /&gt;
    contacts = newContacts;&lt;br /&gt;
  }&lt;br /&gt;
  public void addContact(Contact contact) {&lt;br /&gt;
    if (!contacts.contains(contact)) {&lt;br /&gt;
      contacts.add(contact);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void removeContact(Contact contact) {&lt;br /&gt;
    contacts.remove(contact);&lt;br /&gt;
  }&lt;br /&gt;
  public void removeAllContacts() {&lt;br /&gt;
    contacts = new ArrayList();&lt;br /&gt;
  }&lt;br /&gt;
  public ArrayList getContacts() {&lt;br /&gt;
    return contacts;&lt;br /&gt;
  }&lt;br /&gt;
  public String toString() {&lt;br /&gt;
    return contacts.toString();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Memento pattern in Java ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
The Design Patterns Java Companion&lt;br /&gt;
Copyright (C) 1998, by James W. Cooper&lt;br /&gt;
IBM Thomas J. Watson Research Center&lt;br /&gt;
*/&lt;br /&gt;
import java.awt.BorderLayout;&lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.Dimension;&lt;br /&gt;
import java.awt.Graphics;&lt;br /&gt;
import java.awt.Rectangle;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import java.awt.event.MouseAdapter;&lt;br /&gt;
import java.awt.event.MouseEvent;&lt;br /&gt;
import java.awt.event.MouseMotionAdapter;&lt;br /&gt;
import java.awt.event.WindowAdapter;&lt;br /&gt;
import java.awt.event.WindowEvent;&lt;br /&gt;
import java.util.Vector;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
import javax.swing.JToggleButton;&lt;br /&gt;
import javax.swing.JToolBar;&lt;br /&gt;
public class MemDraw extends JFrame implements ActionListener {&lt;br /&gt;
  JToolBar tbar;&lt;br /&gt;
  Mediator med;&lt;br /&gt;
  &lt;br /&gt;
  public MemDraw() {&lt;br /&gt;
    super(&amp;quot;Memento Drawing&amp;quot;);&lt;br /&gt;
    addWindowListener(new WindowAdapter() {&lt;br /&gt;
      public void windowClosing(WindowEvent e) {&lt;br /&gt;
        System.exit(0);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
    JPanel jp = new JPanel();&lt;br /&gt;
    getContentPane().add(jp);&lt;br /&gt;
    med = new Mediator();&lt;br /&gt;
    jp.setLayout(new BorderLayout());&lt;br /&gt;
    tbar = new JToolBar();&lt;br /&gt;
    jp.add(&amp;quot;North&amp;quot;, tbar);&lt;br /&gt;
    RectButton rect = new RectButton(this, med);&lt;br /&gt;
    tbar.add(rect);&lt;br /&gt;
    UndoButton undo = new UndoButton(this, med);&lt;br /&gt;
    tbar.add(undo);&lt;br /&gt;
    tbar.addSeparator();&lt;br /&gt;
    ClearButton clr = new ClearButton(this, med);&lt;br /&gt;
    tbar.add(clr);&lt;br /&gt;
    JCanvas canvas = new JCanvas(med);&lt;br /&gt;
    jp.add(&amp;quot;Center&amp;quot;, canvas);&lt;br /&gt;
    MouseApp map = new MouseApp(med);&lt;br /&gt;
    canvas.addMouseListener(map);&lt;br /&gt;
    MouseMoveApp mvap = new MouseMoveApp(med);&lt;br /&gt;
    canvas.addMouseMotionListener(mvap);&lt;br /&gt;
    setSize(new Dimension(400, 300));&lt;br /&gt;
    setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void actionPerformed(ActionEvent e) {&lt;br /&gt;
    Command comd = (Command) e.getSource();&lt;br /&gt;
    comd.Execute();&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  static public void main(String[] argv) {&lt;br /&gt;
    new MemDraw();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
//==============================&lt;br /&gt;
class MouseApp extends MouseAdapter {&lt;br /&gt;
  Mediator med;&lt;br /&gt;
  public MouseApp(Mediator md) {&lt;br /&gt;
    super();&lt;br /&gt;
    med = md;&lt;br /&gt;
  }&lt;br /&gt;
  public void mousePressed(MouseEvent e) {&lt;br /&gt;
    med.createRect(e.getX(), e.getY());&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseReleased(MouseEvent e) {&lt;br /&gt;
    med.rememberPosition();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class MouseMoveApp extends MouseMotionAdapter {&lt;br /&gt;
  Mediator med;&lt;br /&gt;
  public MouseMoveApp(Mediator md) {&lt;br /&gt;
    super();&lt;br /&gt;
    med = md;&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseDragged(MouseEvent e) {&lt;br /&gt;
    med.drag(e.getX(), e.getY());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class ClearButton extends JButton implements Command {&lt;br /&gt;
  Mediator med;&lt;br /&gt;
  public ClearButton(ActionListener act, Mediator md) {&lt;br /&gt;
    super(&amp;quot;C&amp;quot;);&lt;br /&gt;
    setToolTipText(&amp;quot;Clear&amp;quot;);&lt;br /&gt;
    addActionListener(act);&lt;br /&gt;
    med = md;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void Execute() {&lt;br /&gt;
    med.clear();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class JCanvas extends JPanel {&lt;br /&gt;
  Mediator med;&lt;br /&gt;
  public JCanvas(Mediator md) {&lt;br /&gt;
    med = md;&lt;br /&gt;
    med.registerCanvas(this);&lt;br /&gt;
    setBackground(Color.white);&lt;br /&gt;
  }&lt;br /&gt;
  public void paint(Graphics g) {&lt;br /&gt;
    super.paint(g);&lt;br /&gt;
    med.reDraw(g);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class Mediator {&lt;br /&gt;
  boolean startRect;&lt;br /&gt;
  boolean rectSelected;&lt;br /&gt;
  Vector drawings;&lt;br /&gt;
  Vector undoList;&lt;br /&gt;
  RectButton rect;&lt;br /&gt;
  JPanel canvas;&lt;br /&gt;
  visRectangle selectedRectangle;&lt;br /&gt;
  public Mediator() {&lt;br /&gt;
    startRect = false;&lt;br /&gt;
    rectSelected = false;&lt;br /&gt;
    drawings = new Vector();&lt;br /&gt;
    undoList = new Vector();&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void startRectangle() {&lt;br /&gt;
    startRect = true;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void createRect(int x, int y) {&lt;br /&gt;
    unpick(); //make sure no rectangle is selected&lt;br /&gt;
    if (startRect) //if rect button is depressed&lt;br /&gt;
    {&lt;br /&gt;
      Integer count = new Integer(drawings.size());&lt;br /&gt;
      undoList.addElement(count); //Save previous drawing list size&lt;br /&gt;
      visRectangle v = new visRectangle(x, y);&lt;br /&gt;
      drawings.addElement(v); //add new element to list&lt;br /&gt;
      startRect = false; //done with this rectangle&lt;br /&gt;
      rect.setSelected(false); //unclick button&lt;br /&gt;
      canvas.repaint();&lt;br /&gt;
    } else&lt;br /&gt;
      pickRect(x, y); //if not pressed look for rect to select&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void registerRectButton(RectButton rb) {&lt;br /&gt;
    rect = rb;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void registerCanvas(JPanel p) {&lt;br /&gt;
    canvas = p;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  private void unpick() {&lt;br /&gt;
    rectSelected = false;&lt;br /&gt;
    if (selectedRectangle != null) {&lt;br /&gt;
      selectedRectangle.setSelected(false);&lt;br /&gt;
      selectedRectangle = null;&lt;br /&gt;
      repaint();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void rememberPosition() {&lt;br /&gt;
    if (rectSelected) {&lt;br /&gt;
      Memento m = new Memento(selectedRectangle);&lt;br /&gt;
      undoList.addElement(m);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void pickRect(int x, int y) {&lt;br /&gt;
    //save current selected rectangle to avoid double save of undo&lt;br /&gt;
    visRectangle lastPick = selectedRectangle;&lt;br /&gt;
    unpick();&lt;br /&gt;
    for (int i = 0; i &amp;lt; drawings.size(); i++) {&lt;br /&gt;
      visRectangle v = (visRectangle) drawings.elementAt(i);&lt;br /&gt;
      if (v.contains(x, y)) //did click inside a rectangle&lt;br /&gt;
      {&lt;br /&gt;
        selectedRectangle = v; //save it&lt;br /&gt;
        rectSelected = true;&lt;br /&gt;
        if (selectedRectangle != lastPick) //but don&amp;quot;t save twice&lt;br /&gt;
          rememberPosition();&lt;br /&gt;
        v.setSelected(true); //turn on handles&lt;br /&gt;
        repaint(); //and redraw&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void clear() {&lt;br /&gt;
    drawings = new Vector();&lt;br /&gt;
    undoList = new Vector();&lt;br /&gt;
    rectSelected = false;&lt;br /&gt;
    selectedRectangle = null;&lt;br /&gt;
    repaint();&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  private void repaint() {&lt;br /&gt;
    canvas.repaint();&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void drag(int x, int y) {&lt;br /&gt;
    if (rectSelected) {&lt;br /&gt;
      if (selectedRectangle.contains(x, y)) {&lt;br /&gt;
        selectedRectangle.move(x, y);&lt;br /&gt;
        repaint();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void reDraw(Graphics g) {&lt;br /&gt;
    g.setColor(Color.black);&lt;br /&gt;
    for (int i = 0; i &amp;lt; drawings.size(); i++) {&lt;br /&gt;
      visRectangle v = (visRectangle) drawings.elementAt(i);&lt;br /&gt;
      v.draw(g);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void undo() {&lt;br /&gt;
    if (undoList.size() &amp;gt; 0) {&lt;br /&gt;
      //get last element in undo list&lt;br /&gt;
      Object obj = undoList.lastElement();&lt;br /&gt;
      undoList.removeElement(obj); //and remove it&lt;br /&gt;
      //if this is an Integer, the last action was a new rectangle&lt;br /&gt;
      if (obj instanceof Integer) {&lt;br /&gt;
        //remove last created rectangle&lt;br /&gt;
        Object drawObj = drawings.lastElement();&lt;br /&gt;
        drawings.removeElement(drawObj);&lt;br /&gt;
      }&lt;br /&gt;
      //if this is a Memento, the last action was a move&lt;br /&gt;
      if (obj instanceof Memento) {&lt;br /&gt;
        //get the Memento&lt;br /&gt;
        Memento m = (Memento) obj;&lt;br /&gt;
        m.restore(); //and restore the old position&lt;br /&gt;
      }&lt;br /&gt;
      repaint();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
interface Command {&lt;br /&gt;
  public void Execute();&lt;br /&gt;
}&lt;br /&gt;
class RectButton extends JToggleButton implements Command {&lt;br /&gt;
  Mediator med;&lt;br /&gt;
  public RectButton(ActionListener act, Mediator md) {&lt;br /&gt;
    super(&amp;quot;R&amp;quot;);&lt;br /&gt;
    //setSize(new Dimension(25,25));&lt;br /&gt;
    //setBorder(new EmptyBorder(5,5,5,5));&lt;br /&gt;
    setToolTipText(&amp;quot;Draw rectangle&amp;quot;);&lt;br /&gt;
    addActionListener(act);&lt;br /&gt;
    med = md;&lt;br /&gt;
    med.registerRectButton(this);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void Execute() {&lt;br /&gt;
    if (isSelected()) {&lt;br /&gt;
      med.startRectangle();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class UndoButton extends JButton implements Command {&lt;br /&gt;
  Mediator med;&lt;br /&gt;
  public UndoButton(ActionListener act, Mediator md) {&lt;br /&gt;
    super(&amp;quot;U&amp;quot;);&lt;br /&gt;
    //setSize(new Dimension(25,25));&lt;br /&gt;
    //setBorder(new EmptyBorder(5,5,5,5));&lt;br /&gt;
    setToolTipText(&amp;quot;Undo&amp;quot;);&lt;br /&gt;
    addActionListener(act);&lt;br /&gt;
    med = md;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void Execute() {&lt;br /&gt;
    med.undo();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class visRectangle {&lt;br /&gt;
  int x, y, w, h;&lt;br /&gt;
  Rectangle rect;&lt;br /&gt;
  boolean selected;&lt;br /&gt;
  public visRectangle(int xpt, int ypt) {&lt;br /&gt;
    x = xpt;&lt;br /&gt;
    y = ypt;&lt;br /&gt;
    w = 40;&lt;br /&gt;
    h = 30;&lt;br /&gt;
    saveAsRect();&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void setSelected(boolean b) {&lt;br /&gt;
    selected = b;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  private void saveAsRect() {&lt;br /&gt;
    rect = new Rectangle(x - w / 2, y - h / 2, w, h);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void draw(Graphics g) {&lt;br /&gt;
    g.drawRect(x, y, w, h);&lt;br /&gt;
    if (selected) {&lt;br /&gt;
      g.fillRect(x + w / 2, y - 2, 4, 4);&lt;br /&gt;
      g.fillRect(x - 2, y + h / 2, 4, 4);&lt;br /&gt;
      g.fillRect(x + w / 2, y + h - 2, 4, 4);&lt;br /&gt;
      g.fillRect(x + w - 2, y + h / 2, 4, 4);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public boolean contains(int x, int y) {&lt;br /&gt;
    return rect.contains(x, y);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void move(int xpt, int ypt) {&lt;br /&gt;
    x = xpt;&lt;br /&gt;
    y = ypt;&lt;br /&gt;
    saveAsRect();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
//===============================================&lt;br /&gt;
class Memento {&lt;br /&gt;
  visRectangle rect;&lt;br /&gt;
  //saved fields- remember internal fields&lt;br /&gt;
  //of the specified visual rectangle&lt;br /&gt;
  int x, y, w, h;&lt;br /&gt;
  public Memento(visRectangle r) {&lt;br /&gt;
    rect = r;&lt;br /&gt;
    x = rect.x;&lt;br /&gt;
    y = rect.y;&lt;br /&gt;
    w = rect.w;&lt;br /&gt;
    h = rect.h;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void restore() {&lt;br /&gt;
    //restore the internal state of&lt;br /&gt;
    //the specified rectangle&lt;br /&gt;
    rect.x = x;&lt;br /&gt;
    rect.y = y;&lt;br /&gt;
    rect.h = h;&lt;br /&gt;
    rect.w = w;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>