设计模式------观察者模式
2019-10-25 06:56:04来源:博客园 阅读 ()
设计模式------观察者模式
观察者模式:
定义对象之间的一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新.
观察者模式的四个角色:
1.Subject(目标)
2.ConcreteSubject(具体目标)
3.Observer(观察者)
4.ConcreteObserver(具体观察者)
举例说明:
多人联机对战中,一个队友遭受攻击将给其他的盟友发送通知.
具体实现:
/**
*
* @ClassName: ControlCenter
* @Description: 指挥部,充当目标抽象类
* @author haibiscuit
* @date 2019年10月22日 下午6:02:49
*
*/
public abstract class ControlCenter {
protected String name; //队伍名称
protected List<Observer> list = new ArrayList<>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//加入战队
public void join(Observer observer) {
list.add(observer);
}
//撤出战队
public void quit(Observer observer) {
list.remove(observer);
}
//抽象方法
public abstract void notifyObserver(String name);
}
/**
*
* @ClassName: ConcreteControllCenter
* @Description: 具体目标类
* @author haibiscuit
* @date 2019年10月22日 下午8:50:23
*
*/
public class ConcreteControllCenter extends ControlCenter{
public ConcreteControllCenter(String name) {
System.out.println("战队-"+name+"-创建成功!");
this.name = name;
}
@Override
public void notifyObserver(String name) {
System.out.println(name+"遭受攻击!");
for (Observer observer : list) {
if(!((Player)observer).getName().equals(name)) {
observer.help();
}
}
}
}
/**
*
* @ClassName: Observer
* @Description: 抽象观察者类
* @author haibiscuit
* @date 2019年10月22日 下午6:16:54
*
*/
public abstract class Observer {
protected abstract void help();
protected abstract void beAttacked(ControlCenter controlCenter);
}
/**
*
* @ClassName: Player
* @Description: 具体观察者类
* @author haibiscuit
* @date 2019年10月22日 下午6:20:30
*
*/
public class Player extends Observer{
private String name ;
public Player(String name) {
this.name = name;
}
@Override
protected void help() {
System.out.println(name+"来救你!");
}
@Override
protected void beAttacked(ControlCenter controlCenter) {
controlCenter.notifyObserver(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
*
* @ClassName: ObserverTest
* @Description: 观察者模式的测试类
* @author haibiscuit
* @date 2019年10月22日 下午8:51:05
*
*/
public class ObserverTest {
public static void main(String args[]) {
ControlCenter controlCenter = new ConcreteControllCenter("英雄战队!");
Observer observer1,observer2,observer3,observer4;
observer1 = new Player("猪队友1");
observer2 = new Player("猪队友2");
observer3 = new Player("猪队友3");
observer4 = new Player("猪队友4");
controlCenter.join(observer1);
controlCenter.join(observer2);
controlCenter.join(observer3);
controlCenter.join(observer4);
observer1.beAttacked(controlCenter);//一个队友被攻击,呼唤其他队友
}
总结:
可以看到,观察者模式和中介者模式非常的相像,两者在原有代码的基础上稍微变动就可以相互转换,只是代码实现的
方式不同.
至于具体的使用场景肯定是完成组件与组件之间的通信了.
原文链接:https://www.cnblogs.com/haibiscuit/p/11722516.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:java-day10
下一篇:深入拆解Java虚拟机
- 设计模式-委派/策略模式 2020-06-09
- 深入理解:设计模式中的七大设计原则 2020-06-07
- 设计模式---类之间的关系知多少 2020-06-07
- 高手眼中的观察者模式有什么不一样 2020-06-05
- Java--Java的设计模式----单例模式 2020-05-26
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash