Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #14630

Re: How is this "pattern" called?

From "John B. Matthews" <nospam@nospam.invalid>
Newsgroups comp.lang.java.programmer
Subject Re: How is this "pattern" called?
Date 2012-05-18 15:35 -0400
Organization The Wasteland
Message-ID <nospam-0A319A.15355218052012@news.aioe.org> (permalink)
References <pattern-20120518104439@ram.dialup.fu-berlin.de> <jp5ptm$jp9$1@dont-email.me> <MVC-20120518183901@ram.dialup.fu-berlin.de>

Show all headers | View raw


In article <MVC-20120518183901@ram.dialup.fu-berlin.de>,
 ram@zedat.fu-berlin.de (Stefan Ram) wrote:

> I do not see a real problem with this style, assuming that the 
> assignment at hand was just to write such a simple dot paint program.
> 
> The inner classes can easily share a common model and identifier 
> scope, while at the same time there is some reasonable separation 
> between the different concerns of the inner classes.
> 
> Should it be required later to decouple one of these inner classes 
> more than now, this is also possible using a refactor that will make 
> it become an outer class or will introduce an observer relationship. 
> But should it not be required later, no time is wasted now to 
> implement a decoupling and separation not needed.

I sometimes strive to make nested classes static in order to facilitate 
re-factoring, as suggested in the example below. Static also keeps me 
honest on inadvertent coupling. I also use the somewhat dated Observer 
and Observable classes to stress the observer pattern, even implementing 
Observer despite leaking `this`.

Here's my understanding of the basic architecture:

<http://stackoverflow.com/a/2687871/230513>

Here's a more elaborate example that mentions other ways to implement 
the observer pattern:

<http://stackoverflow.com/a/3072979/230513>

And I frequently refer to this article on Swing & MVC

<http://java.sun.com/products/jfc/tsc/articles/architecture/>

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MVCMain {

    public static void main(String args[]) {
        new MVCMain().buildGui();
    }

    public void buildGui() {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                Model model = new Model();
                View view = new View(model);
                Control control = new Control(model, view);
                JFrame f = new JFrame();
                f.add(view);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.pack();
                f.setLocationRelativeTo(null);
                f.setVisible(true);
            }
        });
    }

    private static final class Model extends Observable {

        private List<Point> points = new ArrayList<Point>();

        public void next(Point p) {
            points.add(p);
            setChanged();
            notifyObservers();
        }

        public List<Point> getPoints() {
            return points;
        }
    }

    private static final class View extends JPanel implements Observer {

        private Model model;

        public View(Model model) {
            this.model = model;
            this.model.addObserver(this);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.blue);
            for (Point p : model.getPoints()) {
                g.fillRect(p.x, p.y, 8, 8);
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(300, 300);
        }

        @Override
        public void update(Observable o, Object arg) {
            repaint();
        }
    }

    private static final class Control {

        private Model model;
        private View view;

        public Control(final Model model, View view) {
            this.model = model;
            this.view = view;
            this.view.addMouseListener(new MouseAdapter() {

                @Override
                public void mousePressed(MouseEvent e) {
                    model.next(e.getPoint());
                }
            });
        }
    }
}

-- 
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>

Back to comp.lang.java.programmer | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

Re: How is this "pattern" called? markspace <-@.> - 2012-05-18 08:29 -0700
  Re: How is this "pattern" called? markspace <-@.> - 2012-05-18 08:37 -0700
  Re: How is this "pattern" called? markspace <-@.> - 2012-05-18 10:35 -0700
    Re: How is this "pattern" called? Wanja Gayk <brixomatic@yahoo.com> - 2012-05-30 14:32 +0200
  Re: How is this "pattern" called? "John B. Matthews" <nospam@nospam.invalid> - 2012-05-18 15:35 -0400
  Re: How is this "pattern" called? Arne Vajhøj <arne@vajhoej.dk> - 2012-05-19 22:29 -0400

csiph-web