设计模式——观察者模式

1、定义

观察者模式(发布-订阅模式):定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并自动更新

2、意义是:解耦,将观察者与被观察者解耦,是的他们之间的依赖性更小

设计模式——观察者模式_第1张图片

3、简单实现

(1)针对观察者与被观察者分别定义接口,有利于分别进行扩展

(2)重点就在被观察者的实现中:

​ 1)定义观察者集合,并定义针对集合的天剑、删除操作,用于增加、删除观察者

​ 2)定义通知方法,用于将新情况通知给观察者用户

(3)观察者需要有个接收被观察者通知的方法

4、例子

观察者接口:

/**

 * 这是观察者接口

 * @author XZY

 *

 */

public interface Observer {

	void update(String message,String  name);

}

观察者的实现类:一个被观察者可以有多个观察者

/**

 * 这是一个观察者的实现类A

 * @author XZY

 *

 */

public class ObserverImplA implements Observer {

	String name="Observer-A";

@Override

	public void update(String message, String name1) {

	// TODO Auto-generated method stub

		System.out.println(name+":"+name1+"那里有新的情况"+message);

		}
}

/**

 * 这是观察者的实现类B

 * @author XZY

 *

 */

public class ObserverImplB implements Observer {

 	String name="Observer-B";

@Override

public void update(String message, String name1) {

// TODO Auto-generated method stub

	System.out.println(name+":"+name1+"那里有新的情况"+message);

	}
}


被观察者类:

/**

 * 这是一个被观察者接口,里面定义了怎么添加观察者,怎么删除观察者和怎么通知观察者的方法

 * @author XZY

 *

 */

public interface Subject {

	//这个方法用于添加观察者

	void addObserver(Observer observer);

	//这个方法用于删除观察者

	void removeObserver(Observer observer);

	//这个方法用于通知观察者

	void notice(String message);

}

 

被观察者的具体实现类:

public class SubjectImpl1 implements Subject {

	private List observerslist=new ArrayList();

	private String subjectName="subject-1";

	@Override

	public void addObserver(Observer observer) {

		if(!observerslist.contains(observer)) {

			observerslist.add(observer);

		}

}
	@Override

	public void removeObserver(Observer observer) {

		if(observerslist.contains(observer)) {

			observerslist.remove(observer);
		}

	}

 

	//在这个方法里面通知观察者

	@Override

	public void notice(String message) {
		for(Observer observer:observerslist) {
			observer.update(message, subjectName);
		}

	}
}


测试方法:

public class Test {

	public static void main(String[] args) {

		//注意:这里全部采用向上转型的方式,将生成的对象转型成接口

		//创建一个观察者A

		Observer a=new ObserverImplA();

		//创建一个观察者A

		Observer b=new ObserverImplB();

		//创建一个被观察者

		Subject subject1=new SubjectImpl1();

		subject1.addObserver(a);

		subject1.addObserver(b);

		subject1.notice("最近有新款上市啦");

	}

}

5、总结:一个被观察者可以有多个观察者,并且通过接口对观察者和被观察者进行逻辑解耦,降低二者的直接耦合

你可能感兴趣的:(设计模式,设计模式——观察者模式,怎么理解观察者模式,通俗易懂的观察者模式)