设计模式(18):JAVA(18):设计模式(11)观察者模式 观察者模式:被观察者发生变化时,所有被观察者都会通知
2021/9/4 20:06:08
本文主要是介绍设计模式(18):JAVA(18):设计模式(11)观察者模式 观察者模式:被观察者发生变化时,所有被观察者都会通知,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
如题,我们先抽象出被观察者和观察者
/** *抽象观察者 */ abstract class obServer { protected String name; public obServer(String name) { this.name = name; } protected SubJect subJect; //更新接口 public abstract void updata(); //不在观察 public abstract void dontLook(SubJect subJect); }
/** *抽象被观察者 */ abstract class SubJect{ //所有观察者 private List<obServer> obServerList=new ArrayList<>(); //状态 private int state; public int getState() { return state; } public void setState(int state) { this.state = state; } //添加观察者 public void attach(obServer obServer){ obServerList.add(obServer); System.out.println("新增观察者:"+obServer.name); } //删除观察者 public void deletObServer(obServer obServer){ obServerList.remove(obServer); System.out.println("移除观察者:"+obServer.name); } //更新观察者 public void updateObServer(){ for (obServer o:obServerList) { o.updata(); } } }
有一档电视节目来当实体(被观察者)
class TVPlay extends SubJect{ private String theTVSet; public String getTheTVSet() { return theTVSet; } public void setTheTVSet(String theTVSet) { this.theTVSet = theTVSet; } public void play(){ System.out.println("电视剧开播了!今日节目:"+ theTVSet); //通知观察者 updateObServer(); } }
人实体来充当观察者
class People extends obServer{ public People(String name) { super(name); } @Override public void updata() { System.out.println(name+"收到电视剧开播通知"); } @Override public void dontLook(SubJect subJect) { subJect.deletObServer(this); } }
执行时,被观察者会检查所有观察者,去调用play下发通知
public static void main(String[] args) { TVPlay tvPlay = new TVPlay(); People man = new People("男人"); People woman = new People("女人"); tvPlay.attach(man); tvPlay.attach(woman); tvPlay.setTheTVSet("宫锁心玉"); tvPlay.play(); System.out.println("新的一期开始了!"); System.out.println("上次不好看,男人取消了观察"); man.dontLook(tvPlay); tvPlay.setTheTVSet("宫锁心玉2"); tvPlay.play(); }
这篇关于设计模式(18):JAVA(18):设计模式(11)观察者模式 观察者模式:被观察者发生变化时,所有被观察者都会通知的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-09-28AI给的和自己写的Python代码,都无法改变输入框的内容,替换也不行
- 2024-09-27Sentinel配置限流资料:新手入门教程
- 2024-09-27Sentinel配置限流资料详解
- 2024-09-27Sentinel限流资料:新手入门教程
- 2024-09-26Sentinel限流资料入门详解
- 2024-09-26Springboot框架资料:初学者入门教程
- 2024-09-26Springboot框架资料详解:新手入门教程
- 2024-09-26Springboot企业级开发资料:新手入门指南
- 2024-09-26SpringBoot企业级开发资料新手指南
- 2024-09-26Springboot微服务资料入门教程