1.观察者模式
“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。
(1)被观察者
被观察对象,如果发生了变化,则通知观察者执行相应操作。
(2)观察者
具体执行操作的对象,可以有多个。
2.实例
(1)定义一个被观察者
package cn.com.yy;
import java.util.Date;
import java.util.Observable;
/**
* Movie: Observable
* @author Administrator
*
*/
public class Movie extends Observable {
private String movieName; //movie name
private Date onlineTime; // online time
private boolean flag; //online flag. true-online yet;false--no online
public String getMovieName() {
return movieName;
}
public void setMovieName(String movieName) {
this.movieName = movieName;
}
public Date getOnlineTime() {
return onlineTime;
}
public void setOnlineTime(Date onlineTime) {
this.onlineTime = onlineTime;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public void onlineInfo(Movie m){
if(m.isFlag()){
setChanged();
}
//notify all observers
//call all observers update(this,arg) method.
notifyObservers(m);
}
}
(2)定义两个观察者
第一:UserSMS.java
package cn.com.yy;
import java.util.Observable;
import java.util.Observer;
/**
*
* @author Administrator
*
*/
public class UserSMS implements Observer {
public void update(Observable o, Object arg) {
if(arg instanceof Movie){
NotifyUtils.sendSMS((Movie) arg);
}
}
}
第二:UserEmail.java
package cn.com.yy;
import java.util.Observable;
import java.util.Observer;
public class UserEmail implements Observer {
public void update(Observable o, Object arg) {
if(arg instanceof Movie){
NotifyUtils.sendEmail((Movie) arg);
}
}
}
(3)定义工具类
package cn.com.yy;
import java.text.SimpleDateFormat;
import java.util.Date;
public class NotifyUtils {
//SMS
public static void sendSMS(Movie movie){
println("SMS",movie);
}
//Email
public static void sendEmail(Movie movie){
println("Email",movie);
}
private static void println(String s, Movie movie) {
System.out.println("******************************");
if("SMS".equals(s)){
System.out.println("尊敬的手机用户您好,电影《" + movie.getMovieName()+"》上线了.");
}
else{
System.out.println("尊敬的邮箱用户您好,电影《" + movie.getMovieName()+"》上线了.");
}
System.out.println("上线时间为:" + transferDate(movie.getOnlineTime())+".");
System.out.println("请您及时观看.");
}
/*
* date format method
*/
public static String transferDate(Date d){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(d);
}
}
(4)程序入口
package cn.com.yy;
import java.util.Date;
public class Client {
public static void main(String[] args){
Date d = new Date();
Movie movie = new Movie();
movie.setMovieName("那年在中国");
movie.setOnlineTime(d);
movie.setFlag(true);
UserSMS sms = new UserSMS();
UserEmail email = new UserEmail();
movie.addObserver(sms);
movie.addObserver(email);
movie.onlineInfo(movie);
}
}
(5)结果
******************************
尊敬的邮箱用户您好,电影《那年在中国》上线了.
上线时间为:2013-10-29 12:27:28.
请您及时观看.
******************************
尊敬的手机用户您好,电影《那年在中国》上线了.
上线时间为:2013-10-29 12:27:28.
请您及时观看.