洪雅网站建设,建设英文品牌网站,视频直播app开发网站,本周最新新闻● 观察者模式介绍 观察者模式是一个使用频率非常高的模式#xff0c;它最常用的地方是GUI系统、订阅——发布系统。因为这个模式的一个重要作用就是解耦#xff0c;将被观察者和观察者解耦#xff0c;使得它们之间依赖性更小#xff0c;甚至做到毫无依赖。以CUI系统来说它最常用的地方是GUI系统、订阅——发布系统。因为这个模式的一个重要作用就是解耦将被观察者和观察者解耦使得它们之间依赖性更小甚至做到毫无依赖。以CUI系统来说应用的UI具有易变性尤其是前期随着业务的改变或者产品的需要修改应用界面也会经常性变化但是业务逻辑基本变化不大此时GUI系统需要一套机制来应对这种情况使得UI层与具体的业务逻辑解耦观察者模式此时就派上用场了。
● 观察者模式的定义 定义对象间一种一对多的依赖关系使得每当一个对象改变状态则所有依赖它的对象都会得到通知并被自动更新。
● 观察者模式的使用场景 关联行为场景需要注意的是关联行为是可拆分的而不是“组合”关系 事件对接触发场景 跨系统的消息交换场景如消息队列、事件总线的处理机制。
● 观察者模式的UML类图 UML类图下图所示。 角色介绍。 Subject抽象主题也就是被观察者Observable的角色抽象主题角色把所有观察者对象的引用在一个集合里每个主题都可以有任意数量的观察者抽象主题提供一个接口可以增加和删除观察者对象。 ConcreteSubject具体主题该角色将有关状态存入具体观察者对象在具体主题的内部状态发生改变时给所有注册过的观察者发出通知具体主题角色又叫做具体被观察者Concrete Observable角色。 Observer抽象观察者该角色是观察者的抽象类它定义了一个更新接口使得在得到主题的更改通知时更新自己。 ConcreteObserver具体的观察者该角色实现抽象观察者角色所定义的更新接口以便在主题的状态发生变化时更新自身状态。
● 观察者模式的简单实现 假设有一个开发技术前线网站是一个聚合了关于Android、iOS新技术文章的开源库等内容的网站在这里可以看到新技术、强大的开源库、新的信息经常浏览这两网站不仅能够开阔眼界也能让我们接触到前沿的科技信息。 开发技术前线不仅是个内容发布页面也支持用户邮箱订阅每周发布周报后会将优质的内容推送给订阅用户这种模式叫做发布——订阅模式它的另一个名称是观察者模式。 下面让我们来简单模拟一下开发技术前线的发布——订阅过程。
/*** 程序是观察者*/
public class Coder implements Observer {public String name;public Coder(String name) {this.name name;}Overridepublic void update(Observable o, Object arg) {System.out.println(Hi, name , DevTechFrontier更新新, 内容 arg);}NonNullOverridepublic String toString() {return 码农 name;}
}
/*** DevTechFrontier 即开发技术前线这个网站是被观察者角色当它有更新时所有的观察者这里是程序员* 都接到相应的通知*/
public class DevTechFrontier extends Observable {public void postNewPublication(String content) {//标识状态或者内容发生改变setChanged();//通知所有观察者notifyObservers(content);}
}
/*** 测试代码*/
public class Test {public static void main(String[] args) {//被观察的角色DevTechFrontier devTechFrontier new DevTechFrontier();Coder mrsimple new Coder(mr.simple);Coder coder1 new Coder(coder-1);Coder coder2 new Coder(coder-2);Coder coder3 new Coder(coder-3);//将观察者注册到可观察对象的观察者列表中devTechFrontier.addObserver(mrsimple);devTechFrontier.addObserver(coder1);devTechFrontier.addObserver(coder2);devTechFrontier.addObserver(coder3);//发布消息devTechFrontier.postNewPublication(新的一期开发技术前线周报发布啦);}
} 输出结果 可以看到所有订阅了开发技术前线的用户都收到了更新消息一对多的订阅——发布系统就完成了。 Oblerver和Observable是JDK中内置类型可见观察者模式是非常重要的这里Obsserver是抽象的观察者角色Coder扮演的是具体观察者的角色Observable对应的是抽象主题角色DevTechFrontier则是具体的主题角色。Coder是具体的观察者它们订阅了DevTechFrontier这个具体的可观察对象当DevTechFrontier有更新时会遍历所有观察者这里是Coder然后给这些观察者发布一个更新的消息即调用Observer和Observable这些抽象类因此Coder和DevTechFrontier完全没有耦合保证了订阅系统的灵活性、可扩展性。