Android的开发之&java23中设计模式------观察者模式

观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种
观察者(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。
被观察者 被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。
撤销观察 观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。

public class TeacherSubject implements Subject {
    //用来存放和记录观察者
    private List<Observer> observers=new ArrayList<>();
    //记录状态的字符串
    private String info;

    @Override
    public void addObserver(Observer obj) {
        observers.add(obj);
    }

    @Override
    public void deleteObserver(Observer obj) {
        int i=observers.indexOf(obj);
        if (i>=0){
            observers.remove(obj);
        }
    }

    @Override
    public void notifyObserver() {
        for (int i=0;i<observers.size();i++){
            Observer o=observers.get(i);
            o.update(info);
        }
    }

    //布置作业的方法,在方法最后,需要调用notifyObserver()方法,通知所有观察者更新状态
    public void setHomework(String info){
        this.info=info;
        System.out.print("今天的作业是"+info);
        this.notifyObserver();
    }
}
public class StudentObserver implements Observer {
    //保存一个Subject的引用,以后如果可以想取消订阅,有了这个引用会比较方便
    private TeacherSubject t;
    //学生的姓名,用来标识不同的学生对象
    private String name;
    //构造器用来注册观察者
    public StudentObserver(String name, TeacherSubject t){
        this.name=name;
        this.t=t;
        t.addObserver(this);
    }

    @Override
    public void update(String info) {
        System.out.print(name+"得到作业:"+info);
    }
}
/**
 * Created by Administrator on 2017-10-9.
 * Oserver接口
 */

public interface Observer {
    void update(String info);
}
/**
 * Created by Administrator on 2017-10-9.
 * 被观察者Teacher:
 */

public class Teacher extends Observable {
    //布置作业的状态信息字符串
    private String info;
    public void setHomework(String info){
        this.info=info;
        System.out.println("布置的作业是"+info);
        setChanged();
        notifyObservers();
    }
    public String getInfo(){
        return info;
    }
}
/**
 * Created by Administrator on 2017-10-9.
 * 观察者Student
 */

public class Student implements java.util.Observer{
    private Observable ob;
    private String name;

    public Student(String name,Observable ob){
        this.ob=ob;
        this.name=name;
        ob.addObserver(this);
    }

    @Override
    public void update(Observable observable, Object data) {
        Teacher t= (Teacher) observable;
        System.out.println(name+"得到作业信息:"+t.getInfo());
    }
}
/**
 * Created by Administrator on 2017-10-9.
 * //主题接口
 */

public interface Subject {
    //添加观察者
    void addObserver(Observer obj);
    //移除观察者
    void deleteObserver(Observer obj);
    //当主题方法改变时,这个方法被调用,通知所有的观察者
    void notifyObserver();
}

/**
 * 观察者模式(Observer)
 */
public class ObserverMethodActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_observer_method);

        TeacherSubject teacherSubject=new TeacherSubject();
        StudentObserver zhangsan=new StudentObserver("张三",teacherSubject);
        StudentObserver lisi=new StudentObserver("李四",teacherSubject);
        StudentObserver wangwu=new StudentObserver("王五",teacherSubject);

        teacherSubject.setHomework("第二页第六题");
        teacherSubject.setHomework("第三页第七题");

//        java内置的观察者模式:
        Teacher teacher=new Teacher();
        com.zhangyingjie.DesignMode.ObserverMehtod.Student zhaoliu=new com.zhangyingjie.DesignMode.ObserverMehtod.Student("赵六",teacher);
        com.zhangyingjie.DesignMode.ObserverMehtod.Student sunqi=new com.zhangyingjie.DesignMode.ObserverMehtod.Student("孙七",teacher);

        teacher.setHomework("第四页第八题");
        teacher.setHomework("第五页第九题");
    }
}
github地址:https://github.com/zyj18410105150/DesignMode

猜你喜欢

转载自blog.csdn.net/jie1123161402/article/details/78688823