您的位置:首页 > 其它

设计模式观察者模式(ObserverPatern)

2018-01-04 11:31 316 查看
核心模块:抽象观察者,具体观察者,抽象主题,具体主题

所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git

使用场景:一个对象的改变将导致一个或多个其他对象也发生改变,适合一对一或者一对多的场景;

优点:主题和观察者之间松耦合(观察者并不需要知道主题发生了什么变化),符合opc原则(新增观察者只需要实现抽象观察者),支持广播(一对多);

缺点:如果观察者较多,抽象主题通知和遍历将会花费很多时间,如果观察者和主题之间有循环依赖,可能造成循环依赖;

注意:
1,多个观察者时,不可以依赖特定的通知次序,特定的通知次序请使用职责链模式;

/**
* Created by tory on 2018/1/3.
* 观察者模式
* 使用场景:一个对象发生改变时将自动通知其他对象
*/
public class ObserverPatern {
public static void main(String[] args) {
WeatherSubject weather = new WeatherSubject();
weather.register(new PhoneObserver());
weather.register(new ComputerObserver());
weather.publish("今天多云");
weather.publish("明天下雨");
}
}

//Subject 抽象主题,Obervable 被观察者/被订阅者
abstract class Subject {
protected String message;
private List<Observer> list;

public Subject() {
list = new ArrayList<>(8);
}

//订阅subscribe
public void register(Observer observer) {
list.add(observer);
}

//取消订阅
public void delete(Observer observer) {
list.remove(observer);
}

//发布内容
public void publish(String message) {
this.message = message;
for (Observer observer : list) {
observer.update(this, message);
}
}
}

//Observer 抽象观察者,
interface Observer {
public void update(Subject all, String message);
}

//ConcreteSubject具体被观察者,被订阅的主题
class WeatherSubject extends Subject {
String city;
String wind;
String quality;
String humidity;

WeatherSubject() {
city = "成都";
wind = "3级";
quality = "200";
humidity = "相对湿度80%";
}
}

//ContreObserver 具体订阅者
class PhoneObserver implements Observer {
//手机订阅天气
@Override
public void update(Subject all, String message) {
System.out.println("手机收到消息:" + message);
}
}

//ContreObserver 具体订阅者
class ComputerObserver implements Observer {
//电脑订阅天气
@Override
public void update(Subject all, String message) {
if (all instanceof WeatherSubject) {
WeatherSubject weather = (WeatherSubject) all;
System.out
.println("电脑收到消息:" + weather.message + " " + weather.city + " " + weather.quality + " " + weather
.humidity);
} else {
System.out.println("电脑收到消息:" + message);
}
}
}


内容打印
Hello World!
手机收到消息:今天多云
电脑收到消息:今天多云 成都 200 相对湿度80%
手机收到消息:明天下雨
电脑收到消息:明天下雨 成都 200 相对湿度80%
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息