zoukankan      html  css  js  c++  java
  • 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);
    }
  • 相关阅读:
    Leetcode: Increasing Triplet Subsequence
    Snapchat面经(师兄的)
    M面经prepare: Shuffle a deck
    M面经Prepare: Find integer Average of 2 integers.
    M面经Prepare: Positive-Negative partitioning preserving order
    M面经Prepare: Delete Words Starting With One Character
    Lintcode: Subtree
    Leetcode: Reconstruct Itinerary
    Groupon面经:Find paths in a binary tree summing to a target value
    一些小感悟(2014.04版)
  • 原文地址:https://www.cnblogs.com/LUA123/p/7824791.html
Copyright © 2011-2022 走看看