码迷,mamicode.com
首页 > 其他好文 > 详细

观察者模式

时间:2016-08-19 12:58:16      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:

观察者模式:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知,并自动更新。

 

针对接口编程,不针对实现编程,为交互对象之间的松耦合设计而努力。

 

/**

 *观察者订阅的主题

 */

public interface Subject {

    public void addObserver(Observer observer);

    

    public void deleteObserver(Observer observer);

    

    public void notifyAllObserver();

}

/**

 * 主题实现类

 */

public class SubjectAchieve implements Subject {

    private List<Observer> observerList;

    private boolean changed = false;//主要用于控制订阅发布的粒度控制

    private User user;

    

    public SubjectAchieve() {

        observerList = new ArrayList<Observer>();

    }

    

    @Override

    public void addObserver(Observer observer) {

        observerList.add(observer);

    }

 

    @Override

    public void deleteObserver(Observer observer) {

        observerList.remove(observer);

    }

 

    @Override

    public void notifyAllObserver() {

        if (changed) {

            for (Observer observer : observerList) {

                observer.update(user);

            }

            changed = false;

        }

    }

    

    public void setUser(User user) {

        this.user = user;

    }

    

    public void setChanged(boolean changed) {

        this.changed = changed;

    }

}

//观察者接口

public interface Observer {

    public void update(User user);

}

//观察者实现类

public class ObserverAchieve implements Observer {

    private Subject subject;

    

    public ObserverAchieve(Subject subject) {

        this.subject = subject;

        subject.addObserver(this);

    }

    

    @Override

    public void update(User user) {

        System.out.println("age:" + user.getAge() + "\tname:" + user.getName());

    }

}

//又一观察者实现类

public class ObserverAcnieveOther implements Observer {

    private Subject subject;

    

    public ObserverAcnieveOther(Subject subject) {

        this.subject = subject;

        subject.addObserver(this);

    }

    

    @Override

    public void update(User user) {

        System.out.println("ageOther:" + user.getAge() + "\tnameOther:" + user.getName());

    }

}

/**

 * 主题将此的变化通知给观察者

 */

public class User {

    private int age;

    private String name;

    public User() {}

    public User(int age, String name) {

        this.age = age;

        this.name = name;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        this.age = age;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

}

//测试类

public class Test {

    public static void main(String[] args) {

        SubjectAchieve subject = new SubjectAchieve();

        Observer observer = new ObserverAchieve(subject);

        

        Observer observer1 = new ObserverAcnieveOther(subject);

        

        subject.setChanged(true);

        

        User user = new User(12, "xxx");

        subject.setUser(user);

        

        subject.notifyAllObserver();

   }

}

//结果:

age:12 name:xxx

ageOther:12 nameOther:xxx

观察者模式

标签:

原文地址:http://www.cnblogs.com/fanguangdexiaoyuer/p/5786890.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!