zoukankan      html  css  js  c++  java
  • 利用接口实现自定义监听事件以及观察者模式

    前段时间刚做过,事件一长就容易忘,赶紧记下来先

     1 package com.xujingyang.JT;
     2 
     3 public class Jt {
     4     interface Listenner{
     5         public void run();
     6     }
     7     
     8     
     9      class test{
    10          Listenner listenner=null;
    11         public void setOnRunListenner(Listenner ls){
    12             listenner=ls;
    13         }
    14         
    15         public void changeEvent(){
    16             if(listenner!=null){
    17                 listenner.run();
    18             }
    19         }
    20     }
    21     
    22     
    23     public static void main(String[] args) {
    24         test t=new Jt().new test();
    25         t.setOnRunListenner(new Listenner() {
    26             
    27             @Override
    28             public void run() {
    29                 System.out.println("我是run");
    30             }
    31         });
    32         
    33         t.changeEvent();
    34     }
    35 }
    View Code

    代码稍微修改,便是标准的观察者模式

    观察者模式很好理解,类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。先来看看关系图:

     1 package com.xujingyang.JT;
     2 
     3 import java.util.Iterator;
     4 import java.util.LinkedList;
     5 import java.util.List;
     6 
     7 public class Jt {
     8     interface Listenner {
     9         public void run();
    10     }
    11 
    12     class Listenner1 implements Listenner {
    13 
    14         @Override
    15         public void run() {
    16             System.out.println("run1");
    17         }
    18 
    19     }
    20 
    21     class Listenner2 implements Listenner {
    22 
    23         @Override
    24         public void run() {
    25             System.out.println("run2");
    26         }
    27 
    28     }
    29 
    30     interface subject {
    31         /* 增加观察者 */
    32         public void add(Listenner observer);
    33 
    34         /* 删除观察者 */
    35         public void del(Listenner observer);
    36 
    37         /* 通知所有的观察者 */
    38         public void notifyObservers();
    39 
    40         /* 自身的操作 */
    41         public void operation();
    42     }
    43     
    44     abstract class AbstractSubject implements subject{
    45 
    46         List< Listenner> list=new LinkedList<Listenner>();
    47         @Override
    48         public void add(Listenner observer) {
    49             list.add(observer);
    50         }
    51 
    52         @Override
    53         public void del(Listenner observer) {
    54             list.remove(observer);
    55         }
    56 
    57         @Override
    58         public void notifyObservers() {
    59             Iterator<Listenner> iterator = list.iterator();
    60             while (iterator.hasNext()) {
    61                 iterator.next().run();
    62             }
    63         }
    64 
    65      }
    66 
    67     
    68     class mySubject extends AbstractSubject{
    69 
    70         @Override
    71         public void operation() {
    72             System.out.println("开始啦...");
    73             notifyObservers();
    74         }
    75         
    76     }
    77     
    78     
    79 
    80     public static void main(String[] args) {
    81         subject s=new Jt().new mySubject();
    82         s.add(new Jt().new Listenner1());
    83         s.add(new Jt().new Listenner2());
    84         s.operation();
    85     }
    86 }
    View Code

    结果:

  • 相关阅读:
    悟透JavaScript(理解js面向对象)(转)
    spark相关问题
    hive常见问题以及解析
    visual studio code添加leetcode插件
    阿里云oss的使用
    Poi工具类快速生成Ecxel(升级版)
    linux实现增量拷贝数据,代替scp
    nginx实现均衡负载
    idea 程序包不存在 解决办法
    通过word文件模板生成word文件
  • 原文地址:https://www.cnblogs.com/xujingyang/p/6512113.html
Copyright © 2011-2022 走看看