carfield.com.hk Button.java 2004-03-24T16:00:00Z 2004-03-24T16:00:00Z <br/><TEXTAREA name="code" class="java" rows="16" cols="100">package examples.chainOfResponsibility.java; /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * This file is part of the design patterns project at UBC * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the &quot;License&quot;); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/. * * Software distributed under the License is distributed on an &quot;AS IS&quot; basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is ca.ubc.cs.spl.patterns. * * Contributor(s): */ import javax.swing.*; import java.awt.event.*; /** * GUI element at the start of the responsibility chain. A click on the * button starts a request. The &lt;code&gt;Button&lt;/code&gt; will not handle the * request, but pass it on to its successor. * * @author Jan Hannemann * @author Gregor Kiczales * @version 1.0, 05/13/02 * */ public class Button extends JButton implements Handler { /** * the successor in the chain of responsibility */ protected Handler successor; /** * Creates a &lt;code&gt;Button&lt;/code&gt; with a given label and successor. * * @param s The button label * @param successor The successor in the chain of responsibility */ public Button(String s, Handler successor) { super(s); this.successor = successor; this.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println(&quot;\nStarting new request...&quot;); handleRequest(); } }); } /** * Implements the method to handle requests as defined by the * &lt;code&gt;Handler&lt;/code&gt; interface. The request is not handled here. * * @see Handler */ public void handleRequest() { System.out.println(&quot;Request received by: Button (unhandled: forwarded)&quot;); successor.handleRequest(); } } </TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2004-03-24T16:00:00Z Frame.java 2004-03-24T16:00:00Z 2004-03-24T16:00:00Z <br/><TEXTAREA name="code" class="java" rows="16" cols="100">package examples.chainOfResponsibility.java; /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * This file is part of the design patterns project at UBC * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the &quot;License&quot;); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/. * * Software distributed under the License is distributed on an &quot;AS IS&quot; basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is ca.ubc.cs.spl.patterns. * * Contributor(s): */ import javax.swing.JFrame; import java.awt.event.WindowEvent; import java.awt.event.WindowAdapter; /** * Represents a regular GUI frame modified to be able to accept requests. * * @author Jan Hannemann * @author Gregor Kiczales * @version 1.0, 05/13/02 * */ public class Frame extends JFrame implements Handler { /** * the successor in the chain of responsibility */ protected Handler successor; /** * Creates a &lt;code&gt;Frame&lt;/code&gt; with a given title. The frame * does not have a successor and handles request that it receives. * * @param s the frame title */ public Frame(String s) { super(s); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } /** * Implements the method to handle requests as defined by the * &lt;code&gt;Handler&lt;/code&gt; interface. The request is handled here. * * @see Handler */ public void handleRequest() { System.out.println(&quot;Request received by: Frame (handled)&quot;); } } </TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2004-03-24T16:00:00Z Handler.java 2004-03-24T16:00:00Z 2004-03-24T16:00:00Z <br/><TEXTAREA name="code" class="java" rows="16" cols="100">package examples.chainOfResponsibility.java; /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * This file is part of the design patterns project at UBC * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the &quot;License&quot;); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/. * * Software distributed under the License is distributed on an &quot;AS IS&quot; basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is ca.ubc.cs.spl.patterns. * * Contributor(s): */ /** * Defines the interface for asking Handlers if they want to handle a request. * * @author Jan Hannemann * @author Gregor Kiczales * @version 1.0, 05/13/02 * */ public interface Handler { public void handleRequest(); } </TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2004-03-24T16:00:00Z Main.java 2004-03-24T16:00:00Z 2004-03-24T16:00:00Z <br/><TEXTAREA name="code" class="java" rows="16" cols="100">package examples.chainOfResponsibility.java; /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * This file is part of the design patterns project at UBC * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the &quot;License&quot;); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/. * * Software distributed under the License is distributed on an &quot;AS IS&quot; basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is ca.ubc.cs.spl.patterns. * * Contributor(s): */ /** * Implements a GUI-motivated example for the Chain Of Rspsonsibility design * pattern.&lt;p&gt; * * Intent: &lt;i&gt;Avoid coupling the sender of a request to its receiver by giving * more than one object a chance to handle the request. Chain the receiving * objects and pass the request along the chain until an object handles it. * &lt;/i&gt;&lt;p&gt; * * Participatng objects are a &lt;code&gt;Frame&lt;/code&gt;, a &lt;code&gt;Panel&lt;/code&gt;, and * &lt;code&gt;Button&lt;/code&gt; * * A click on the button triggers an event (request) that gets passed along * the widget hierarchy (button -&gt; panel -&gt; frame). * * The &lt;code&gt;Handler&lt;/code&gt; interface defines the &lt;code&gt;handleRequest()&lt;/code&gt; * method for asking an object if it is willing to handle the request. * * &lt;p&gt;&lt;i&gt;This is the Java version.&lt;/i&gt;&lt;p&gt; * * In this version, the event not handled by button and panel. Only frame * handles the event. * * @author Jan Hannemann * @author Gregor Kiczales * @version 1.0, 05/13/02 * * @see Button * @see Panel * @see Frame * @see Handler */ public class Main { /** * Implements the driver for the chain of responisbility example. * It creates a simple GUI consisting of a &lt;code&gt;Button&lt;/code&gt; in a * &lt;code&gt;Panel&lt;/code&gt; in a &lt;code&gt;Frame&lt;/code&gt;. * * Clicking the button will start a request, that gets passed on * along the following chain: button, panel, frame. the frame handles * the event. &lt;p&gt; * * The following messages should be observed on a buttonclick: &lt;OL&gt; * &lt;LI&gt; An Indication that the request was started * &lt;LI&gt; Request received by: Button (unhandled: forwarded) * &lt;LI&gt; Request received by: Panel (unhandled: forwarded) * &lt;LI&gt; Request received by: Frame (handled) * &lt;/UL&gt; */ public static void main(String[] args) { Frame frame = new Frame(&quot;Chain of Responsibility&quot;); Panel panel = new Panel(frame); Button button = new Button(&quot;Click me to see the Chain Of Responsibility pattern in action!&quot;, panel); frame.getContentPane().add(panel); panel.add(button); frame.pack(); frame.setVisible(true); } }</TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2004-03-24T16:00:00Z MyChain.java 2004-03-24T16:00:00Z 2004-03-24T16:00:00Z <br/><TEXTAREA name="code" class="java" rows="16" cols="100">package examples.chainOfResponsibility.aspectj; /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * This file is part of the design patterns project at UBC * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the &quot;License&quot;); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/. * * Software distributed under the License is distributed on an &quot;AS IS&quot; basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is ca.ubc.cs.spl.patterns. * * Contributor(s): */ import java.awt.event.ActionEvent; import ca.ubc.cs.spl.pattern.library.ChainOfResponsibilityProtocol; /** * Implements an instance of the abstracted ChainOfResponsibility design * pattern. Here, the a click on the button triggers an event (request) * that gets passed along the widget hierarchy (button -&gt; panel -&gt; frame). * * In this implementation, the request is handled by the panel if the * CTRL mask is active (i.e., if the CTRL key was pressed while the button * was clicked). If the SHIFT mask is active, the frame handles the request. * Otherwise, the request is unhandled. * * @author Jan Hannemann * @author Gregor Kiczales * @version 1.0, 05/13/02 * */ public aspect MyChain extends ChainOfResponsibilityProtocol { /** * Frame, Panel and Button are all Handlers */ declare parents: Frame implements Handler; declare parents: Panel implements Handler; declare parents: Button implements Handler; // declare parents: ActionEvent implements Object; // this would be nice! doesn't work on classes where AJ does not control the source protected pointcut eventTrigger(Handler handler, Object event): call(void Button.doClick(ActionEvent)) &amp;&amp; target(handler) &amp;&amp; args(event); public boolean Frame.acceptRequest(Object event) { if (event instanceof ActionEvent) { ActionEvent ae = (ActionEvent) event; return ((ae.getModifiers() &amp; ActionEvent.SHIFT_MASK) != 0 ); } return false; } public void Frame.handleRequest(Object event) { MyChain.aspectOf().note(&quot;Class &quot;+this.getClass().getName() + &quot; is handling the event&quot;); } public boolean Panel.acceptRequest(Object event) { if (event instanceof ActionEvent) { ActionEvent ae = (ActionEvent) event; return ((ae.getModifiers() &amp; ActionEvent.CTRL_MASK) != 0 ); } return false; } public void Panel.handleRequest(Object event) { MyChain.aspectOf().note(&quot;Class &quot;+this.getClass().getName() + &quot; is handling the event&quot;); } } </TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2004-03-24T16:00:00Z Panel.java 2004-03-24T16:00:00Z 2004-03-24T16:00:00Z <br/><TEXTAREA name="code" class="java" rows="16" cols="100">package examples.chainOfResponsibility.java; /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * This file is part of the design patterns project at UBC * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the &quot;License&quot;); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/. * * Software distributed under the License is distributed on an &quot;AS IS&quot; basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is ca.ubc.cs.spl.patterns. * * Contributor(s): */ import javax.swing.*; /** * Represents a regular GUI panel modified to be able to accept requests. * * @author Jan Hannemann * @author Gregor Kiczales * @version 1.0, 05/13/02 * */ public class Panel extends JPanel implements Handler { /** * the successor in the chain of responsibility */ protected Handler successor; /** * Creates a &lt;code&gt;Panel&lt;/code&gt; with a given successor. * * @param successor The successor in the chain of responsibility */ public Panel(Handler successor) { super(); this.successor = successor; } /** * Implements the method to handle requests as defined by the * &lt;code&gt;Handler&lt;/code&gt; interface. The request is not handled here. * * @see Handler */ public void handleRequest() { System.out.println(&quot;Request received by: Panel (unhandled: forwarded)&quot;); successor.handleRequest(); } } </TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2004-03-24T16:00:00Z files.lst 2004-03-24T16:00:00Z 2004-03-24T16:00:00Z <br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> 2004-03-24T16:00:00Z