1.观察者模式(Observer Pattern):定义对象之间一对多的依赖关系,每当一个对象状态发生改变时,与其依赖的对象都会得到通知并被自动更新。

2.观察者模式的角色

(1)Subject(目标):指被观察的对象,目标类可以是接口也可以是抽象类或者具体类;在目标中定义一个观察者集合,一个观察目标可以接受任意数量的观察者来观察,它提供方法来增加、删除观察者对象,同时定义了通知方法notify()。

(2)ConcreteSubject(具体目标):是目标类的子类,通常包含有经常发生改变的数据,当它的状态发生改变时将向它的各个观察者发送通知,同时还可以实现在目标类中定义的抽象业务逻辑方法。

(3)Observer(观察者):将对观察目标(具体目标类)的改变做出反应,观察者一般定义为接口,该接口声明了更新数据的方法update()

(4)ConcreteObserver(具体观察者):在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致;它实现了在抽象观察者中定义的update()方法,通常在实现时可以调用具体目标类的attach()方法将自己添加到目标类的集合中或者通过detach()方法从中将自己删除。

import java.util.*;
/**
设置一个抽象目标类Subject,也就是被观察者*/
public abstract class Subject{//定义一个观察者集合用于存储所有观察者对象protected ArrayList observers<Observer> = new ArrayList();//注册一个方法,用于向观察者集合增加一个观察者public void attach(Observer observer){observers.add(observer);}//注销方法,用于从观察者集合中删除一个观察者public void detach(Observer observer){observers.remove(observer);} //声明抽象通知方法public abstract void notify();
}
/*具体目标类ConcreteSubject是实现了抽象目标类Subject的一个具体的子类,其典型代码如下*/
public class ConcreateSubject extends Subject{//实现通知方法public void notify(){//遍历观察者集合,调用每一个观察者的响应方法for(Object obs:observers){((Observer)obs).update();}}
}
/**
抽象观察者角色一般定义为一个接口,通常声明一个update()方法*/
public interface Observer{//声明响应方法public void update();
}
/*在具体的观察者ConcreteObserver中实现了update()方法*/
public class ConcreteObserver implements Observer{//实现具体的响应方法public void update(){//具体的响应代码}
}
/**将被观察者和观察者进行创建和连接
客户端在调用目标对象的notify()方法时将调用在其观察者集合中注册的观察者对象的update()方法。
*/
···
Subject subject = new ConcreateSubject();
Observer observer = new Concreateobserver();
subject.attach(observer);
subject.notify();
···

3.实例说明及实例代码:开始游戏后,五个游戏角色(李白、花木兰、鲁班一号、王昭君、张飞)加入己方战队,然后鲁班遭到攻击(鲁班一号:为什么受伤的总是我?!),战队服务器便通知己方英雄,己方英雄便立即前去增援。

import java.util.*;/**定义目标类即被观察者类*/
public abstract class TeamControl {protected String teamName;//队伍名称protected ArrayList<Observer>players = new ArrayList<Observer>();//定义一个集合用作于存储战队成员public void setTeamName(String teamName){this.teamName = teamName;}public String getTeamName(){return this.teamName;}//成员加入方法public void join(Observer obs){System.out.println(obs.getName() + "加入" + this.teamName + "战队!");players.add(obs);}//成员退出方法public void quit(Observer obs){System.out.println(obs.getName() + "退出" + this.teamName + "战队!");players.remove(obs);}//声明抽象通知方法public abstract void notifyObserver(String name);
}
/*充当具体目标类*/
public class ConcreteTeamControl extends TeamControl {public static String TAG = "Observer";public ConcreteTeamControl(String teamName){System.out.println(teamName + "战队组建成功!");System.out.println("-------------------------------");this.teamName = teamName;}//实现通知方法public void notifyObserver(String name){System.out.println(this.teamName + "战队紧急通知,盟友" + name + "遭受敌人的攻击!");//遍历观察者集合,调用每一个盟友(自己除外)的支援方法for(Object obs : players){if(!((Observer)obs).getName().equalsIgnoreCase(name)){((Observer)obs).help();}}}
}
/**抽象观察类*/
public interface Observer{public String getName();public void setName(String name);public void help();//声明支援盟友方法public void beAttacked(TeamControl team);//声明遭受攻击方法
}
/*充当具体观察类*/
public class Player implements Observer{private String name;public Player(String name){this.name=name;}public void setName(String name){this.name=name;}public String getName(){return this.name;}//支援盟友的方法的实现public void help(){System.out.println("坚持住," + this.name + "来救你!");}//遭受攻击方法的实现,当遭受攻击时将调用战队的控制中心类的通知方法notifyOberver()来通知盟友@Overridepublic void beAttacked(TeamControl team) {System.out.println(this.name + "被攻击!");team.notifyObserver(name);}
}
/**客户端进行测试*/
public class Client{public static void main(String args[]){//定义观察目标对象即被观察者TeamControl team = new ConcreteTeamControl("王者荣耀");;//定义四个观察者对象Observer player1, player2, player3, player4, player5;player1 = new Player("李白");team.join(player1);player2 = new Player("王昭君");team.join(player2);player3 = new Player("鲁班一号");team.join(player3);player4 = new Player("花木兰");team.join(player4);player5 = new Player("张飞");team.join(player5);//某成员遭受攻击player3.beAttacked(team);}
}

4.代码运行结果

java设计模式之用王者荣耀打开观察者模式(附代码实例)每天一学设计模式相关推荐

  1. Java爬虫 --- 爬取王者荣耀英雄图片

    Java爬虫 - 爬取王者荣耀英雄图片 import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Docu ...

  2. python玩王者荣耀皮肤碎片怎么获得_用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例...

    本文使用python的第三方模块requests爬取王者荣耀所有英雄的图片,并将图片按每个英雄为一个目录存入文件夹中,方便用作桌面壁纸 下面时具体的代码,已通过python3.6测试,可以成功运行: ...

  3. java实现语音发送,Java实现发送手机短信语音验证功能代码实例

    这篇文章主要介绍了java实现发送手机短信语音验证功能代码实例,www.cppcns.com文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 利用第三方 ...

  4. 基于java的圆通快递单号自动识别api接口代码实例

    一.产品介绍 快递单号识别,输入运单号自动识别物流公司,实时返回对应物流公司编码.查询单号时,返回的结果可能存在一个或多个物流公司编码,快递鸟大数据平台通过智能分析,实时更新单号库,保障物流公司编码准 ...

  5. Java Web实现登录注册(超详细附代码)

    Java Web实现登录注册(超详细附代码) 文章目录 Java Web实现登录注册(超详细附代码) 1.前言 2.登录注册设计流程 3.注册的数据流程 4.登录的数据流程 5.部分代码的展示 5.1 ...

  6. 王者荣耀java实现_从王者荣耀看设计模式-策略模式(java版)

    王者荣耀 曾经我也是一名玩农药的大学生,但现在已经弃了,别问我为什么(被坑爹队友坑的哭...).而今天我们来把让农药变荣耀,我们来从王者荣耀中看设计模式的策略模式. 射手 00.分析 我们先来思考,王 ...

  7. 设计模式入门(王者荣耀之设计英雄篇)

    有问题或建议,欢迎留言.你们每一次点赞.批评都是我前进的动力 目录 一.你的大脑在想什么 二.欢迎来到王者荣耀之英雄设计 三.开始撸代码 四.00原则 一.你的大脑在想什么 大部分学习是一件充满乏味和 ...

  8. 手把手教Java初学者制作一个王者荣耀游戏,1天就能学会。

    刚入门的java初学者,在学会一定项目后,都想先做一款游戏来练练手,来看看自己的知识掌握的怎么样了,那有的初学者并不知道可以做哪些项目,和不知道自己能做什么项目,现在小编就带大家来一起看看Java开发 ...

  9. java鲁班课程_王者荣耀版Java教程第三期:鲁班刚出水晶就死了??

    场景回顾 用王者荣耀学JAVA,鲁班刚在水晶复活就没了--我们来聊聊什么是引用类型? 如果一个变量的类型是类类型,不是基本数据类型,那么这个变量叫做引用.比如说你刚开了一局排位,鲁班刚从水晶出来,就好 ...

  10. java入门教程:如何用java编写一款王者荣耀游戏?

    Java是一种编程语言,被特意设计用于互联网的分布式环境.Java具有类似于C++语言的"形式和感觉",但它要比C++语言更易于使用,而且在编程时彻底采用了一种"以对象为 ...

最新文章

  1. 【Linux】服务管理命令和压缩管理的详细解读
  2. 向服务器写入错误日志-log
  3. 你真的了解分层架构吗?——写给被PetShop毒害的朋友们
  4. 总结篇——git本地仓库上传更新到github
  5. (二)文档请求不同源之window.postMessage跨域
  6. 成功创业者培养的四个习惯
  7. webpack5学习与实战-(六)-babel-loader解析js文件
  8. 用c语言编写车牌识别系统,这算干货吗?写点车牌识别系统方案
  9. android在体检报告叫什么,体检报告检测分析
  10. mac免安装mysql配置_mysql免安装版配置使用
  11. 手机端追剧神器,最新最火电影免费看,非常牛批!
  12. oracle11g远程命令执行漏洞,「漏洞通告」WebLogic多个远程代码执行漏洞
  13. [SSD大法好]神舟K480-I5-D3鸟枪换炮M6S
  14. Android中日志打印 Log的使用
  15. css属性:hover
  16. 潘多拉开发板——emwin5.44裸机移植记录(ST7789驱动)
  17. Android Process管理(进程管理) 详解
  18. 吃货们看好了!python+selenium爬取淘宝美食
  19. 向着第二层 第一阶段第二十四天
  20. 关于Android Studio 模拟器“ANDROID SDK_ ROOT”的问题

热门文章

  1. vigenere加密与解密算法
  2. PDF图形(PDF graphics)
  3. pktgen-dpdk 使用笔记
  4. mac 更换默认蓝牙适配器_解决Switch最大遗憾,谷粒ROUTE Air蓝牙适配器:简单好用...
  5. html模板里引入js函数的几种方法
  6. duilib在同一个界面中(xml)加载两种自定义的list
  7. C++ stack(STL stack)
  8. 密码库LibTomCrypt学习记录——(2)分组密码算法的工作模式
  9. 各大影视、资源、技术论坛地址及简介2006版!
  10. 下载地图制作成GST格式(谷歌、百度、高德)导入到Mapinfo中使用