java 观察者设计模式

java 观察者设计模式,第1张

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);

    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5685404.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存