zoukankan      html  css  js  c++  java
  • 观察者模式、事件驱动模式一些思考

    参考http://www.cnblogs.com/zuoxiaolong/p/pattern7.html

     定义:观察者模式(有时又被称为发布-订阅模式、模型-视图模式、源 -收听者模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这 通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。

     简单点概括成通俗的话来说,就是一个类管理着所有依赖于它的观察者类,并且它状态变化时会主动给这些依赖它的类发出通知。

    事件监听模式

    事件监听模式

     该模式主要由事件源,事件对象,以及事件监听器三元素构成。

     监听器相当于观察者模式中的观察者(Observer),事件源相当于观察者模式中的主题(Subject),事件对象相当于观察者模式中的主题的主题内容(主题是一个类,那么观察者对主题中的莫些属性字段(主题内容)感兴趣,当这些属性值变化了,那么主题通知观察者)

    Button是事件源,假设Button现在向拥有点击事件,那么它必须对外开放一个点击行为方法,并拥有点击事件监听器,当Button被点击(点击方法被调用),调用监听器方法,并创建一个点击事件对象传递给监听器。

    到这里,观察者与事件监听模式,区别在于观察者中的主题将主题内容从主题中剥离出去,更加抽象解藕。

    //监听器
    package java.util;
    
    /**
     * A tagging interface that all event listener interfaces must extend.
     * @since JDK1.1
     */
    public interface EventListener {
    }
    
    import java.util.EventListener;
    //点击监听器
    interface ClickListener extends EventListener{
    
        void click(ClickEvent clickEvent);
        
    }
    
    //双击监听器
    interface DblClickListener extends EventListener{
    
        void dblClick(DblClickEvent dblClickEvent);
        
    }
    //事件
    public class EventObject implements java.io.Serializable {
    
        private static final long serialVersionUID = 5516075349620653480L;
    
        /**
         * The object on which the Event initially occurred.
         */
        protected transient Object  source;
    
        /**
         * Constructs a prototypical Event.
         *
         * @param    source    The object on which the Event initially occurred.
         * @exception  IllegalArgumentException  if source is null.
         */
        public EventObject(Object source) {
        if (source == null)
            throw new IllegalArgumentException("null source");
    
            this.source = source;
        }
    
        /**
         * The object on which the Event initially occurred.
         *
         * @return   The object on which the Event initially occurred.
         */
        public Object getSource() {
            return source;
        }
    
        /**
         * Returns a String representation of this EventObject.
         *
         * @return  A a String representation of this EventObject.
         */
        public String toString() {
            return getClass().getName() + "[source=" + source + "]";
        }
    }
    
    
    
    import java.util.EventObject;
    //按钮事件基类
    public abstract class ButtonEvent extends EventObject{
    
        public ButtonEvent(Object source) {
            super(source);
        }
    
        public Button getButton(){
            return (Button) super.getSource();
        }
    }
    //点击事件
    class ClickEvent extends ButtonEvent{
    
        public ClickEvent(Object source) {
            super(source);
        }
    
    }
    //双击事件
    class DblClickEvent extends ButtonEvent{
    
        public DblClickEvent(Object source) {
            super(source);
        }
    
    }
    //我们模拟一个html页面的button元素,LZ只添加个别属性,其余属性同理
    //事件源
    public class Button {
        
        private String id;//这相当于id属性
        private String value;//这相当于value属性
        private ClickListener onclick;//我们完全模拟原有的模型,这个其实相当于onclick属性
        private DblClickListener onDblClick;//同理,这个相当于双击属性
        private MouseMoveListener onMouseMove;//同理
        
        //按钮的单击行为
        public void click(){
            onclick.click(new ClickEvent(this));
        }
        //按钮的双击行为
        public void dblClick(){
            onDblClick.dblClick(new DblClickEvent(this));
        }
        //按钮的鼠标移动行为
        public void mouseMove(int x,int y){
            onMouseMove.mouseMove(new MouseMoveEvent(this,x,y));
        }
        //相当于给id赋值
        public void setId(String id) {
            this.id = id;
        }
        //类似
        public void setValue(String value) {
            this.value = value;
        }
        //这个相当于我们在给onclick添加函数,即设置onclick属性
        public void setOnclick(ClickListener onclick) {
            this.onclick = onclick;
        }
        //同理
        public void setOnDblClick(DblClickListener onDblClick) {
            this.onDblClick = onDblClick;
        }
        //同理
        public void setOnMouseMove(MouseMoveListener onMouseMove) {
            this.onMouseMove = onMouseMove;
        }
        //以下get方法
        public String getId() {
            return id;
        }
        
        public String getValue() {
            return value;
        }
        
        public ClickListener getOnclick() {
            return onclick;
        }
        
        public DblClickListener getOnDblClick() {
            return onDblClick;
        } 
    }
    
  • 相关阅读:
    HDU 2414 Chessboard Dance(模拟题,仅此纪念我的堕落)
    poj 1625 (AC自动机好模版,大数好模版)
    HDU 1907 John(博弈)
    如何创建一个.NET Core项目
    C#中的委托
    WEB开发者必备的7个JavaScript函数
    带你进入Angular js的大门
    程序猿的年终总结,各种版本各种残
    ASP.NET 开发人员不必担心 Node 的五大理由
    7 个 jQuery 最佳实践
  • 原文地址:https://www.cnblogs.com/shysky77/p/7017893.html
Copyright © 2011-2022 走看看