观察者模式(一)

医学院的外科老师给同学讲解什么是无菌什么是干净,老师说:你把一坨屎放在高压锅里蒸一个刻钟,它就是无菌的了,但是它干净不干净呢?真是服了这个老师,好有才。(摘~~)

观察者模式:定义对象之间一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

书中阐述的例子是报纸订阅服务:

出版者 就是一:出版者更新数据,马上立刻通知订阅者

订阅者 就是多:订阅者即为观察者,获取消息。订阅者可以选择退出观察队列,非订阅者可以选择加入观察队列中。

subject--->observer

需要定义两大接口:一个 主题 接口,一个 观察者 接口(针对接口进行编程,而不是针对实现进行编程)

我们可以把主题想象成一个狼人杀公会,此公会需要向外提供注册的,退出公会,并提供即时更新公会消息通知给公会成员的接口。

而公会成员有很多很多,因此仍然需要提供一个成员接口,用于获取公会消息。具体的公会成员只需要实现即可。每个成员属于自己的消息显示界面。我们把消息显示界面也定义成一个接口。

具体实现如下:

首先定义一个狼人杀公会接口:

package com.zl.observer.one;

public interface GuildWolf {
	public void registerObserver(Observer o);//参数为成员对象
	public void removeObserver(Observer o);
	public void notifyObserver();//该方法用于发布消息
}

公会成员接口:

package com.zl.observer.one;

public interface Observer {

	public void update(String message);
}

消息显示接口:

package com.zl.observer.one;

public interface DisplayMessage {

	public void display();
}

建立一个狼人杀公会:

package com.zl.observer.one;

import java.util.ArrayList;

public class GuildWolfOne implements GuildWolf {

	private ArrayList<Observer> Observes;//把公会成员依次放进list容器中,便于管理
	private String message;
	public GuildWolfOne(){
		Observes=new ArrayList<Observer>();
	}
	@Override
	public void registerObserver(Observer o) {
		// TODO Auto-generated method stub
		Observes.add(o);
	}

	@Override
	public void removeObserver(Observer o) {
		// TODO Auto-generated method stub
            int i = Observes.indexOf(o);
            if(i>=0)
               Observes.remove(i);
      
	}

	@Override
	public void notifyObserver() {
		// TODO Auto-generated method stub

		for(int i=0;i<Observes.size();i++){
			Observer observer=Observes.get(i);
			observer.update(message);
		}
	}

	public void MessageContentChanged(){//内部方法直接调用接口方法
		notifyObserver();
	}
	public void setMessageContent(String message){//该方法用于设置消息
		this.message=message;
		
	}
}

实例化第一个狼人杀游戏者:

package com.zl.observer.one;

public class Observerone implements Observer,DisplayMessage {
     private String message;
     private GuildWolf GuildWolfone;
	
	public Observerone(GuildWolf GuildWolfone){//构造器初 申请进入狼人杀公会
		this.GuildWolfone=GuildWolfone;
		GuildWolfone.registerObserver(this);
	}
	@Override
	public void update(String message) {
		// TODO Auto-generated method stub
         this.message=message;
         display();
	}

	public void display(){
		 System.out.println(this.getClass().getName()+message);
	}
}

实例化第二个狼人杀游戏玩家:

package com.zl.observer.one;

public class Observertwo implements Observer, DisplayMessage {
    private GuildWolf  tGuildWolf;
    private String message;
    
	
	public Observertwo(GuildWolf tGuildWolf){
		this.tGuildWolf=tGuildWolf;
		tGuildWolf.registerObserver(this);
	}
	@Override
	public void display() {
		// TODO Auto-generated method stub
 
		System.out.println(this.getClass().getName()+message);
	}

	@Override
	public void update(String message) {
		// TODO Auto-generated method stub
		 this.message=message;
                 display();
	}

}

开始进行测试:

package com.zl.observer.one;

public class TestObserver {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		
		GuildWolfOne tGuildWolf=new GuildWolfOne();
		Observer tObserver=new Observerone(tGuildWolf);
		Observer mObserver=new Observertwo(tGuildWolf);
		tGuildWolf.setMessageContent("节日快乐!!!");
		tGuildWolf.MessageContentChanged();
		
	}

}


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值