zoukankan      html  css  js  c++  java
  • 设计模式—观察者模式

    观察者模式:如果一个对象(被观察者)状态改变时需要去通知其他对象(观察者)进行一些操作,此时可以使用观察者模式。

          其实质还是通过观察者调用本身的方法进行操作。

    示例说明:班长告诉学生老师来了。被观察者:班长,观察者:学生

    被观察者:

    package com.zpj.designMode.observerPattern;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Monitor {
        private List<Observer> obers = new ArrayList<Observer>();
    
        public void notifyStudent() {
            for (Observer ob : obers) {
                ob.teacherIsComming();
            }
        }
    
        public void addObserver(Observer ob) {
            if (ob != null)
                obers.add(ob);
        }
    
        public void removeObserver(Observer ob) {
            if (ob != null)
                obers.remove(ob);
        }
    
    }

    定义观察者接口:

    package com.zpj.designMode.observerPattern;
    
    public interface Observer {
    
        public void teacherIsComming();
    }

    观察者实现类:

    package com.zpj.designMode.observerPattern;
    
    public class Student01 implements Observer {
    
        @Override
        public void teacherIsComming() {
            System.out.println("--------student01  reading");
        }
    
    }
    
    
    package com.zpj.designMode.observerPattern;
    
    public class Student02 implements Observer {
    
        @Override
        public void teacherIsComming() {
            System.out.println("--------student01  reading");
        }
    
    }
    
    
    package com.zpj.designMode.observerPattern;
    
    public class Student03 implements Observer {
    
        @Override
        public void teacherIsComming() {
            System.out.println("--------student01  reading");
        }
    
    }

    测试类:

    package com.zpj.designMode.observerPattern;
    
    import org.junit.Test;
    
    public class TestUtil {
    
        @Test
        public void test01() {
            Monitor mo = new Monitor();
            Observer s1 = new Student01();
            Observer s2 = new Student02();
            Observer s3 = new Student03();
    
            mo.addObserver(s3);
            mo.addObserver(s2);
            mo.addObserver(s1);
    
            mo.notifyStudent();
        }
    
        // java 的观察者模式
        @Test
        public void test02() {
            Monitor02 mo02 = new Monitor02();
            java.util.Observer student04 = new Student04();
            mo02.addObserver(student04);
            mo02.teacherIsComming();
    
        }
    }

    java中是定义的有观察者接口和被观察者抽象类的

    package com.zpj.designMode.observerPattern;
    
    import java.util.Observable;
    
    public class Student04 implements java.util.Observer {
    
        // 实现update抽象方法,在被观察者发生变化之后又在该方法中进行操作
        @Override
        public void update(Observable o, Object arg) {
            System.out.println("------------student04- -----------" + arg);
        }
    
    }
    package com.zpj.designMode.observerPattern;
    
    public class Monitor02 extends java.util.Observable {
    
        public void teacherIsComming() {
            // 设置changed = true,因为当changed== ture的时候才会调用观察者的update()方法。
            setChanged();
            // 通知观察者被观察者发生改变
            notifyObservers("teacher is comming !!!!");
            ;
        }
    
    }

    测试方法见test02()。

    参考链接:观察者模式

    ------------------------

  • 相关阅读:
    Shiro SessionContext和SessionKey的设计概念
    Shiro DefaultWebSessionManager的设计概念
    Shiro SessionDAO的设计概念
    Shiro DefaultSessionManager的设计概念
    Shiro 关于校验Session过期、有效性的设计概念
    Shiro AbstractValidatingSessionManager设计概念
    Windows 查看端口及杀掉进程
    Shiro Session及SessionManager的设计概念
    jQuery操作DOM节点
    jQuery动画效果
  • 原文地址:https://www.cnblogs.com/PerkinsZhu/p/5833582.html
Copyright © 2011-2022 走看看