Java设计模式--缺省适配器模式
Posted 小LUA
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java设计模式--缺省适配器模式相关的知识,希望对你有一定的参考价值。
我认为这个模式比较常见,还记得我们学习Swing的时候吗,有没有见过很多Adapter?那时候不知道Adapter的意义所在,但至少知道他能够省去我们不需要的实现。
这个社会有N中职业(job),但是每个人(people)只可能从事其中一种或者几种,职业类型设成一个接口,难道每次给人设置职业的时候要全部实现吗?在这里就要有一个缺省适配器,缺省适配器是个抽象类,仅仅implements而不实现。然后客户端直接使用Adapter即可选择需要实现的方法,而不用实现全部。
Job
package com.design.adapter.defaultadapter; public interface Job { void police(); void programmer(); void teacher(); void productManager(); }
DefaultJobAdapter
package com.design.adapter.defaultadapter; public abstract class DefaultJobAdapter implements Job { @Override public void police() { } @Override public void programmer() { } @Override public void teacher() { } @Override public void productManager() { } }
客户端
package com.design.adapter.defaultadapter; public class Client { public static void main(String[] args){ People people = new People(); people.addJob(new DefaultJobAdapter() { @Override public void programmer() { System.out.println("写代码,与产品撕逼"); } }); } } class People{ public void addJob(Job job){ } }
这样,就不需要写不需要的代码啦。
看一下WindowAdapter
客户端调用情况
package com.design.adapter.defaultadapter; import javax.swing.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TestWindowsAdapter { public static void main(String[] args){ JFrame frame = new JFrame("Hello"); frame.addWindowListener(new WindowAdapter() { @Override public void windowOpened(WindowEvent e) { super.windowOpened(e); } @Override public void windowClosed(WindowEvent e) { super.windowClosed(e); } @Override public void windowLostFocus(WindowEvent e) { super.windowLostFocus(e); } }); } }
addWindowListener的实现
/** * Adds the specified window listener to receive window events from * this window. * If l is null, no exception is thrown and no action is performed. * <p>Refer to <a href="doc-files/AWTThreadIssues.html#ListenersThreads" * >AWT Threading Issues</a> for details on AWT‘s threading model. * * @param l the window listener * @see #removeWindowListener * @see #getWindowListeners */ public synchronized void addWindowListener(WindowListener l) { if (l == null) { return; } newEventsOnly = true; windowListener = AWTEventMulticaster.add(windowListener, l); }
WindowAdapter的实现
/* * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.awt.event; /** * An abstract adapter class for receiving window events. * The methods in this class are empty. This class exists as * convenience for creating listener objects. * <P> * Extend this class to create a <code>WindowEvent</code> listener * and override the methods for the events of interest. (If you implement the * <code>WindowListener</code> interface, you have to define all of * the methods in it. This abstract class defines null methods for them * all, so you can only have to define methods for events you care about.) * <P> * Create a listener object using the extended class and then register it with * a Window using the window‘s <code>addWindowListener</code> * method. When the window‘s status changes by virtue of being opened, * closed, activated or deactivated, iconified or deiconified, * the relevant method in the listener * object is invoked, and the <code>WindowEvent</code> is passed to it. * * @see WindowEvent * @see WindowListener * @see <a href="https://docs.oracle.com/javase/tutorial/uiswing/events/windowlistener.html">Tutorial: Writing a Window Listener</a> * * @author Carl Quinn * @author Amy Fowler * @author David Mendenhall * @since 1.1 */ public abstract class WindowAdapter implements WindowListener, WindowStateListener, WindowFocusListener { /** * Invoked when a window has been opened. */ public void windowOpened(WindowEvent e) {} /** * Invoked when a window is in the process of being closed. * The close operation can be overridden at this point. */ public void windowClosing(WindowEvent e) {} /** * Invoked when a window has been closed. */ public void windowClosed(WindowEvent e) {} /** * Invoked when a window is iconified. */ public void windowIconified(WindowEvent e) {} /** * Invoked when a window is de-iconified. */ public void windowDeiconified(WindowEvent e) {} /** * Invoked when a window is activated. */ public void windowActivated(WindowEvent e) {} /** * Invoked when a window is de-activated. */ public void windowDeactivated(WindowEvent e) {} /** * Invoked when a window state is changed. * @since 1.4 */ public void windowStateChanged(WindowEvent e) {} /** * Invoked when the Window is set to be the focused Window, which means * that the Window, or one of its subcomponents, will receive keyboard * events. * * @since 1.4 */ public void windowGainedFocus(WindowEvent e) {} /** * Invoked when the Window is no longer the focused Window, which means * that keyboard events will no longer be delivered to the Window or any of * its subcomponents. * * @since 1.4 */ public void windowLostFocus(WindowEvent e) {} }
看一下WindowListener
/* * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.awt.event; import java.util.EventListener; /** * The listener interface for receiving window events. * The class that is interested in processing a window event * either implements this interface (and all the methods it * contains) or extends the abstract <code>WindowAdapter</code> class * (overriding only the methods of interest). * The listener object created from that class is then registered with a * Window using the window‘s <code>addWindowListener</code> * method. When the window‘s status changes by virtue of being opened, * closed, activated or deactivated, iconified or deiconified, * the relevant method in the listener object is invoked, and the * <code>WindowEvent</code> is passed to it. * * @author Carl Quinn * * @see WindowAdapter * @see WindowEvent * @see <a href="https://docs.oracle.com/javase/tutorial/uiswing/events/windowlistener.html">Tutorial: How to Write Window Listeners</a> * * @since 1.1 */ public interface WindowListener extends EventListener { /** * Invoked the first time a window is made visible. */ public void windowOpened(WindowEvent e); /** * Invoked when the user attempts to close the window * from the window‘s system menu. */ public void windowClosing(WindowEvent e); /** * Invoked when a window has been closed as the result * of calling dispose on the window. */ public void windowClosed(WindowEvent e); /** * Invoked when a window is changed from a normal to a * minimized state. For many platforms, a minimized window * is displayed as the icon specified in the window‘s * iconImage property. * @see java.awt.Frame#setIconImage */ public void windowIconified(WindowEvent e); /** * Invoked when a window is changed from a minimized * to a normal state. */ public void windowDeiconified(WindowEvent e); /** * Invoked when the Window is set to be the active Window. Only a Frame or * a Dialog can be the active Window. The native windowing system may * denote the active Window or its children with special decorations, such * as a highlighted title bar. The active Window is always either the * focused Window, or the first Frame or Dialog that is an owner of the * focused Window. */ public void windowActivated(WindowEvent e); /** * Invoked when a Window is no longer the active Window. Only a Frame or a * Dialog can be the active Window. The native windowing system may denote * the active Window or its children with special decorations, such as a * highlighted title bar. The active Window is always either the focused * Window, or the first Frame or Dialog that is an owner of the focused * Window. */ public void windowDeactivated(WindowEvent e); }
以上是关于Java设计模式--缺省适配器模式的主要内容,如果未能解决你的问题,请参考以下文章