之前讲过一篇关于单列模式的模式设计讲解,今天就就对观察者模式进行讲解下吧,在23种设计模式中,观察者模式算是模式设计中的皇后,尤其是在我们做软件设计过的过程中所体现的更是立足无穷,再说它好,还不如来个实例不是更简单明了,我就把对其概念上的讲解以注释的方式写在代码注释中,如下所示:
//首先我们需要先定义一个接口为:抽象观察者
public interface Watcher{
//再定义一个用来获取更新信息接收的方法
public void updateNotify(Content content);
}
//其次定义一个接口为:抽象被观察者
public interface Watched{
//在其接口中定义一个用来增加观察者的方法
public void add(Watcher watcher);
//再定义一个用来删除观察者权利的方法
public void remove(Watcher watcher);
//再定义一个可以实现行为变现并向观察者传输信息的方法
public void notifyWatcher(Content content);
}
//再次就是定义一个类为:具体观察者并实现其接口抽象观察者
public class ConcreteWatcher implements Watcher{
//并覆盖其方法
public void updateNotify(Content content){
int id = content.getId();
String name = content.getName();
String address = content.getAddress();
System.out.println("id:"+id++"/n name:"+name+"/n address:"+address);
}
}
//最后就是定义一个类为:具体被观察者并实现其抽象接口抽象被观察者
public class ConcreteWatched implements Watched{
//定义一个List来封装Watcher
private List<Watcher> list = new ArrayList<Watcher>();
//并覆盖其方法
public void add(Watcher watcher){
list.add(watcer);
}
public void remove(Watcher watcher){
list.remove(watcher);
}
public void notifyWatcher(Content content){
for(Watcher watcher : list){
watcher.updateWatcher(content);
}
}
}
//以面向对象的方式来操作,需要定义一个实体来进行操作
public class Content{
private int id;
private String name;
private String address;
public void setId(int id){
this.id = id;
}
public int getId(){
return id;
}
public void setName{String name}{
this.name = name;
}
public String getName(){
return name;
}
public void setAddress(String address){
this.address = address;
}
public String getAddress(){
return address
}
}
//测试类
public classs Test{
public static void main(String args[]){
//实例一个被观察者
Watched watched = new Watched();
//实例第一个观察者对被观察者进行观察
Watcher watcher1 = new Watcher();
//实例第二个观察者对被观察者进行观察
Watcher watcher2 = new Watcher();
//实例第三个观察者对被观察者进行观察
Watcher watcher3 = new Watcher();
//加入对其观察
watched.add(watcher1);
watched.add(watcher2);
watched.add(watchre3);
//当被观察者发生变化时:调用其信息方法
Content content = new Content();
content.setId("0001");
content.setName("jiangshide");
content.setAddress("beijing");
watched.notifyWatchers(content);
//被观察者可以调用删除方法
watched.remove(watchr2);
content.setName="litian";
watched.notifyWatchers(content);
}
}
好了,以上就是一个完整的对观察者模式设计的核心代码体现,由上面可以知,观察者与被观察者是一个多对一的关系,也就是一个被观察者可同时被多个观察者所共同进行关注,当,被观察者更新时,同时对其观察者会自动更新其信息,为此我又深入的理解并构建了一个UML图:
核心框架代码为:
package com.jsd.observer.app;
/**
* 主抽象被观察者
* @author jiangshide
*
*/
abstract class MainSubject {
abstract void addObserver(MainObserver mainObserver);
abstract void removeObserver(MainObserver mainObserver);
abstract void notifyObservers(MainContent MainContent);
public void localNofity(){}
}
package com.jsd.observer.app;
/**
* 主抽象观察者
* @author jiangshide
*
*/
abstract class MainObserver {
abstract void updataNotyfy(MainContent mainContent);
public void localNotify(){}
}
package com.jsd.observer.app;
/**
* 主内容提供支持
* @author jiangshide
*
*/
public class MainContent {
private int Id;
private String name;
public int getId() {
return Id;
}
public void setId(int id) {
Id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.jsd.observer.app;
/**
* MSN抽象观察者类并继承主抽象观察者
* @author jiangshide
*
*/
abstract class MsnObserver extends MainObserver {
abstract void msnNotify();
}
package com.jsd.observer.app;
/**
* MSN抽象被观察者并继承了主抽象被观察者
* @author jiangshide
*
*/
abstract class MsnSubject extends MainSubject {
}
package com.jsd.observer.app;
/**
* Msn内容提供者
* @author jiangshide
*
*/
public class MsnContent extends MainContent{
private int localId;
private String localName;
private String msnContent;
private String fromResouce;
private String fromTime;
public int getLocalId() {
return localId;
}
public void setLocalId(int localId) {
this.localId = localId;
}
public String getLocalName() {
return localName;
}
public void setLocalName(String localName) {
this.localName = localName;
}
public String getMsnContent() {
return msnContent;
}
public void setMsnContent(String msnContent) {
this.msnContent = msnContent;
}
public String getFromResouce() {
return fromResouce;
}
public void setFromResouce(String fromResouce) {
this.fromResouce = fromResouce;
}
public String getFromTime() {
return fromTime;
}
public void setFromTime(String fromTime) {
this.fromTime = fromTime;
}
}
package com.jsd.observer.app;
import java.util.ArrayList;
import java.util.List;
/**
* MSN绝对被观察者类继承了MSN抽象被观察者类
* @author jiangshide
*
*/
public class MsnConcreteSubject extends MsnSubject {
private List<MainObserver> list = new ArrayList<MainObserver>();
MainObserver msnObserver = new MsnConcreteObserver();
MainObserver newsObserver = new NewsConcreteObserver();
@Override
void addObserver(MainObserver mainObserver) {
// TODO Auto-generated method stub
if(mainObserver.equals(msnObserver)){
//添加关注MSN消息的人
list.add(msnObserver);
}else if(mainObserver.equals(newsObserver)){
//添加关注NEWS新闻的人
list.add(newsObserver);
}else{
//没有想加入任何关注的人
}
}
@Override
void notifyObservers(MainContent mainContent) {
// TODO Auto-generated method stub
for(MainObserver mainObservers : list){
if(mainObservers.equals(msnObserver)){
mainContent = new MsnContent();
}
}
}
@Override
void removeObserver(MainObserver mainObserver) {
// TODO Auto-generated method stub
if(mainObserver.equals(msnObserver)){
//删除此刻有关注MSN消息的人
list.remove(msnObserver);
}else if(mainObserver.equals(newsObserver)){
//删除此刻有关注NEW新闻的人
list.remove(newsObserver);
}
}
}
package com.jsd.observer.app;
/**
* MSN绝对观察者继承了MSN抽象观察者
* @author jiangshide
*
*/
public class MsnConcreteObserver extends MsnObserver {
@Override
public void updataNotyfy(MainContent mainContent) {
// TODO Auto-generated method stub
}
@Override
void msnNotify() {
// TODO Auto-generated method stub
}
}
package com.jsd.observer.app;
/**
* NEWS抽象观察者并继承了主抽象观察者
* @author jiangshide
*
*/
abstract class NewsObserver extends MainObserver {
}
package com.jsd.observer.app;
/**
* NEWS抽象被观察者继承了主抽象被观察者
* @author jiangshide
*
*/
abstract class NewsSubject extends MainSubject{
}
package com.jsd.observer.app;
/**
* NEWS内容提供者并继承了主内容信息
* @author jiangshide
*
*/
public class NewsContent extends MainContent{
private int localId;
private String localName;
private String newsContent;
private String fromResource;
private String linkWeb;
public int getLocalId() {
return localId;
}
public void setLocalId(int localId) {
this.localId = localId;
}
public String getLocalName() {
return localName;
}
public void setLocalName(String localName) {
this.localName = localName;
}
public String getNewsContent() {
return newsContent;
}
public void setNewsContent(String newsContent) {
this.newsContent = newsContent;
}
public String getFromResource() {
return fromResource;
}
public void setFromResource(String fromResource) {
this.fromResource = fromResource;
}
public String getLinkWeb() {
return linkWeb;
}
public void setLinkWeb(String linkWeb) {
this.linkWeb = linkWeb;
}
}
package com.jsd.observer.app;
/**
* NEWS绝对被观察者继承了NEWS抽象被观察者
* @author jiangshide
*
*/
public class NewsConcreteSubject extends NewsSubject {
@Override
void addObserver(MainObserver mainObserver) {
// TODO Auto-generated method stub
}
@Override
void notifyObservers(MainContent mainContent) {
// TODO Auto-generated method stub
}
@Override
void removeObserver(MainObserver mainObserver) {
// TODO Auto-generated method stub
}
}
package com.jsd.observer.app;
/**
* NEWS绝对观察者继承了NEWS抽象观察者
* @author jiangshide
*
*/
public class NewsConcreteObserver extends NewsObserver {
@Override
public void updataNotyfy(MainContent mainContent) {
// TODO Auto-generated method stub
}
}
好了,上面就是我个人在理解观察者模式后的深入理解,请看代码并能看出结构,希望多提出些介意.....