栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java 观察者设计模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 观察者设计模式

使用时间:对象间存在一对多关系时,使用观察者模式(Observer Pattern)

用法:当一个对象被修改时,则会自动通知依赖它的对象。

具体事例:当微信公众号发布新的文章后,关注它的用户会自动接收到文章信息。当课程表修改之后,所有使用课表的学生都会接收到新的课表。

模式实现:本质上使用一个列表,将观察者放入里面。更新时,将信息传到列表中的观察者里。让观察者分别使用信息调用自身的方法。

代码实现事例:课程表修改。

代码实现结果:

首先定义被观察对象的父类,即需要规范被观察对象的行为,这里的被观察者对象为课程表(timetable)

class Subject{
    public void attach(Observer observer){}
    public void detach(Observer observer){}
    public void notifys(Observer observer){}
}

定义课程表类,实现父类定义的方法,并将观察者加入列表。

class Timetable extends Subject{
    private List clist=new ArrayList();
    public String timetablemessage;
    
    public void attach(Observer observer){
        clist.add(observer);
    }
    public void detach(Observer observer){
        clist.remove(observer);
    }
    public void notifys(){
        for (Observer observer:clist)
        {
            observer.update(timetablemessage);
        }
    }

    public void SetTimetable(String timetablemessage){
        this.timetablemessage = timetablemessage;
        System.out.println("+++++++++++++现在的课程表是"+timetablemessage+"++++++++++++++++++++++++++");
    }
}

定义观察者的父类,用来规范子类的行为,这里具体规范学生要实现的方法。

class Observer{
   void update(String timetablemessage){}
}

定义学生类,获取更新的信息,完成更新

class Student extends Observer{
    String name;
    Student(String name)
    {
        this.name = name;
    }
    void update(String timetablemessage){
        System.out.println(name+"已收到"+timetablemessage);

    }
}

主函数调用

class Observer_Pattern {
    public static void main(String[] args){
        //创建观察者
        Observer student1 =new Student("小红");
        Student student2 =new Student("小明");
        Student student3 =new Student("小李");   

        Timetable timetable = new Timetable();
        //将观察者添加到列表
        timetable.attach(student1);
        timetable.attach(student2);
        timetable.attach(student3);

        System.out.println("设置课程表,发送给每一个观察者");
        timetable.SetTimetable("秋季课程表");//设置课程表
        timetable.notifys();                               //通知所有观察者

        System.out.println("修改课程表内容,发送新的课程表");
        timetable.SetTimetable("夏季季课程表,嘻嘻");//重置课程表
        timetable.notifys();                                //通知观察者,更新学生的课程表        

    }
}

完整代码:

package Observer_Pattern;
import java.util.List;
import java.util.ArrayList;
class Observer_Pattern {
    public static void main(String[] args){
        //创建观察者
        Observer student1 =new Student("小红");
        Student student2 =new Student("小明");
        Student student3 =new Student("小李");

        Timetable timetable = new Timetable();
        //将观察者添加到列表
        timetable.attach(student1);
        timetable.attach(student2);
        timetable.attach(student3);

        System.out.println("设置课程表,发送给每一个观察者");
        timetable.SetTimetable("秋季课程表");//设置课程表
        timetable.notifys();                               //通知所有观察者

        System.out.println("修改课程表内容,发送新的课程表");
        timetable.SetTimetable("夏季季课程表,嘻嘻");//重置课程表
        timetable.notifys();                                //通知观察者,更新学生的课程表

    }
}

class Subject{
    public void attach(Observer observer){}
    public void detach(Observer observer){}
    public void notifys(Observer observer){}
}

class Timetable extends Subject{
    private List clist=new ArrayList();
    public String timetablemessage;

    public void attach(Observer observer){
        clist.add(observer);
    }
    public void detach(Observer observer){
        clist.remove(observer);
    }
    public void notifys(){
        for (Observer observer:clist)
        {
            observer.update(timetablemessage);
        }
    }

    public void SetTimetable(String timetablemessage){
        this.timetablemessage = timetablemessage;
        System.out.println("+++++++++++++现在的课程表是"+timetablemessage+"++++++++++++++++++++++++++");
    }
}

class Observer{
   void update(String timetablemessage){}
}

class Student extends Observer{
    String name;
    Student(String name)
    {
        this.name = name;
    }
    void update(String timetablemessage){
        System.out.println(name+"已收到"+timetablemessage);

    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/684854.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号