Frame3.java 
package view;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 * Same functionality as Frame2 but uses an adapter interface to communicate
 * with the outside world instead.  This design allows varying the communication
 * with the outside world.  How the outside world reacts to the events that
 * happen to the view is a variant behavior!
 * Uses the Null-Object Pattern to initialize the adapter avoiding checking for
 * null.
 * @author DXN
 */
public class Frame3 extends Frame2 {

    // Initializes the adapter to a null object:
    private IView2World _v2wAdapter = new IView2World() {
        public Object button1Clicked (ActionEvent e) {
            return null; // does nothing!
        }
        public Object button2Clicked (ActionEvent e) {
            return null; // does nothing!
        }
    };

    public Frame3(String title) {
        super(title);
    }

    public void setV2WAdapter(IView2World v2w) {
        if (null == v2w) {
            throw new IllegalArgumentException("Argument cannot be null!");
        }
        _v2wAdapter = v2w;
    }

    /**
     * Tells _v2wAdapter the button click event happens on jb1.
     */
    protected void jb1Clicked(ActionEvent e) {
        _v2wAdapter.button1Clicked(e);
    }

    /**
     * Tells _v2wAdapter the button click event happens on jb2.
     */
    protected void jb2Clicked(ActionEvent e) {
        _v2wAdapter.button2Clicked(e);
    }

}

IView2World.java 
package view;

import java.awt.event.*;

/**
 * Adapter connecting Frame3 (the View) to the outside world.
 */
public interface IView2World {
    /**
     * Called by Frame3 when its button 1 is clicked.
     */
    public Object button1Clicked (ActionEvent e);

    /**
     * Called by Frame3 when its button 2 is clicked.
     */
    public Object button2Clicked (ActionEvent e);
}

Frame3Controller.java
package controller;

import view.*;
import java.awt.event.*;
import javax.swing.JFrame;
import java.awt.*; // For layout managers.

/**
 * The controller that instantiates a concrete IView2World object and connects
 * the world outside of Frame3 (the view) to Frame3.
 * The concrete adapter is implemented as an anonymous inner classe.
 */
public class Frame3Controller {

    public JFrame constructFrame()  {
        // Local variable needs to be final so that the local inner class
        // can access it:
        final Frame3 frame = new Frame3("View and Controller");

        /**
         * Install as concrete anonymous IView2World adapter in frame, without
         * frame knowing what the adapter does.
         */
        frame.setV2WAdapter(new IView2World()  {

            public Object button1Clicked (ActionEvent e) {
                frame.getContentPane().setLayout(new GridLayout(2,1));
                frame.validate();
                return null;
            }

            public Object button2Clicked (ActionEvent e) {
                frame.getContentPane().setLayout(new FlowLayout());
                frame.validate();
                return null;
            }
        });
        frame.setVisible(true);
        return frame;
    }
}

Frame3App.java
package app;

import view.*;
import controller.*;

/**
 * Instantiates the controller and builds the frame!
 */
public class Frame3App {

    private static void createAndShowGUI() {
        new Frame3Controller().constructFrame().validate();
    }

    public static void main(String[] args) {
	SwingUtilities.invokeLater(new Runnable() {
	    public void run() {
		createAndShowGUI();
	    }
	});     
    }
}