设计模式之观察者模式

由于观察者和主题是多样的,抽象出接口,代码如下

观察者接口:IObserver.java

package Observer;

public interface IObserver {
	/**接收消息**/
	public void reseiveFriendInfo(String FriendInfo);
}

 主题接口:IMySubject.java

/**
 * 
 */
package Observer;

/**
 * 观察者模式主题
 * @author guzhen
 *
 */
public interface IMySubject {
	/**
	 * 订阅主题
	 */
	public boolean registSubject(IObserver o);
	
	/**
	 * 退出订阅
	 */
	public boolean removeSubject(IObserver o);
	
	/**
	 * 主动通知主题内容
	 */
	public void notifyObservers();
}

 下面实现一个观察者和一个主题(你可以实现多个)

MySubject.java

/**
 * @author guzhen
 *
 */
public class MySubject implements IMySubject {

	/**个人信息,需要被广播的信息**/
	private String myInfo;
	
	/**记录订阅主题的人列表**/
	List<IObserver> myfriends;
	
	public String getMyInfo() {
		return myInfo;
	}

	public List<IObserver> getMyfriends() {
		return myfriends;
	}

	public void setMyfriends(List<IObserver> myfriends) {
		this.myfriends = myfriends;
	}
	
	public void setMyInfo(String myInfo) {
		this.myInfo = myInfo;
	}

	public void notifyObservers() {
		if (null != myfriends) {
			for (IObserver friend : myfriends) {
				 friend.reseiveFriendInfo(myInfo);
			}
		}
	}

	public boolean registSubject(IObserver o) {
		if (null == myfriends) {
			myfriends = new ArrayList<IObserver>();
		}
		return myfriends.add(o);
	}
	
	public boolean removeSubject(IObserver o) {
		if (null == myfriends)
			return false;
		else
			return myfriends.remove(o);
	}

	//发布消息
	public static void main(String[] args) {
		IObserver xiaosheng = new Observer("xiaosheng");
		IObserver zhixuan = new Observer("zhixuan");
		
		MySubject mySubject = new MySubject();
		mySubject.registSubject(xiaosheng);//晓生订阅我的消息
		mySubject.registSubject(zhixuan);//志玄订阅我的消息
		
		mySubject.setMyInfo("我是古缜!!!");
		mySubject.notifyObservers();
		
		
	}
}

 Observer.java

/**
 * 
 */
package Observer;

import java.util.List;

/**
 * @author guzhen
 *
 */
public class Observer implements IObserver {

	private String name;
	
	public Observer(String name) {
		this.name = name;
	}
	
	public void reseiveFriendInfo(String FriendInfo) {
		System.out.println(name + "收到" +FriendInfo);
	}

}

 

 

 

注意内置观察者模式的setchange方法

 

运行结果如下:

xiaosheng收到我是古缜!!!
zhixuan收到我是古缜!!!

你可能感兴趣的:(java,设计模式)