坪地网站建设市场微信小程序开发制作平台

当前位置: 首页 > news >正文

坪地网站建设市场,微信小程序开发制作平台,专业彩票网站开发,如何用自己电脑做网站服务器【学习难度#xff1a;★★★☆☆#xff0c;使用频率#xff1a;★★★★★】 3.1. 模式动机 建立一种对象与对象之间的依赖关系#xff0c;一个对象发生改变时将自动通知其他对象#xff0c;其他对象将相应做出反应。在此#xff0c;发生改变的对象称为观察目标#…【学习难度★★★☆☆使用频率★★★★★】 3.1. 模式动机 建立一种对象与对象之间的依赖关系一个对象发生改变时将自动通知其他对象其他对象将相应做出反应。在此发生改变的对象称为观察目标而被通知的对象称为观察者一个观察目标可以对应多个观察者而且这些观察者之间没有相互联系可以根据需要增加和删除观察者使得系统更易于扩展这就是观察者模式的模式动机。 案例1 “红灯停绿灯行”在日常生活中交通信号灯装点着我们的城市指挥着日益拥挤的城市交通。当红灯亮起来往的汽车将停止而绿灯亮起汽车可以继续前行。在这个过程中交通信号灯是汽车更准确地说应该是汽车驾驶员的观察目标而汽车是观察者。随着交通信号灯的变化汽车的行为也将随之而变化一盏交通信号灯可以指挥多辆汽车。如图22-1所示 在软件系统中有些对象之间也存在类似交通信号灯和汽车之间的关系一个对象的状态或行为的变化将导致其他对象的状态或行为也发生改变它们之间将产生联动正所谓“触一而牵百发”。为了更好地描述对象之间存在的这种一对多包括一对一的联动观察者模式应运而生它定义了对象之间一种一对多的依赖关系让一个对象的改变能够影响其他对象。本章我们将学习用于实现对象间联动的观察者模式。 案例2 Sunny软件公司欲开发一款多人联机对战游戏类似魔兽世界、星际争霸等游戏在该游戏中多个玩家可以加入同一战队组成联盟当战队中某一成员受到敌人攻击时将给所有其他盟友发送通知盟友收到通知后将作出响应。        Sunny软件公司开发人员需要提供一个设计方案来实现战队成员之间的联动。 Sunny软件公司开发人员通过对系统功能需求进行分析发现在该系统中战队成员之间的联动过程可以简单描述如下 联盟成员受到攻击–发送通知给盟友–盟友作出响应。 如果按照上述思路来设计系统由于联盟成员在受到攻击时需要通知他的每一个盟友因此每个联盟成员都需要持有其他所有盟友的信息这将导致系统开销较大因此Sunny公司开发人员决定引入一个新的角色——“战队控制中心”——来负责维护和管理每个战队所有成员的信息。当一个联盟成员受到攻击时将向相应的战队控制中心发送求助信息战队控制中心再逐一通知每个盟友盟友再作出响应如图22-2所示 在图22-2中受攻击的联盟成员将与战队控制中心产生联动战队控制中心还将与其他盟友产生联动。        如何实现对象之间的联动如何让一个对象的状态或行为改变时依赖于它的对象能够得到通知并进行相应的处理 3.2. 模式定义 观察者模式(Observer Pattern)定义对象间的一种一对多依赖关系使得每当一个对象状态发生改变时其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅Publish/Subscribe模式、模型-视图Model/View模式、源-监听器Source/Listener模式或从属者Dependents模式。 观察者模式是一种对象行为型模式。 观察者模式是使用频率最高的设计模式之一它用于建立一种对象与对象之间的依赖关系一个对象发生改变时将自动通知其他对象其他对象将相应作出反应。在观察者模式中发生改变的对象称为观察目标而被通知的对象称为观察者一个观察目标可以对应多个观察者而且这些观察者之间可以没有任何相互联系可以根据需要增加和删除观察者使得系统更易于扩展。 3.3. 模式结构 观察者模式包含如下角色 Subject: 目标目标又称为主题它是指被观察的对象。在目标中定义了一个观察者集合一个观察目标可以接受任意数量的观察者来观察它提供一系列方法来增加和删除观察者对象同时它定义了通知方法notify()。目标类可以是接口也可以是抽象类或具体类。ConcreteSubject: 具体目标具体目标是目标类的子类通常它包含有经常发生改变的数据当它的状态发生改变时向它的各个观察者发出通知同时它还实现了在目标类中定义的抽象业务逻辑方法如果有的话。如果无须扩展目标类则具体目标类可以省略。Observer: 观察者观察者将对观察目标的改变做出反应观察者一般定义为接口该接口声明了更新数据的方法update()因此又称为抽象观察者ConcreteObserver: 具体观察者在具体观察者中维护一个指向具体目标对象的引用它存储具体观察者的有关状态这些状态需要和具体目标的状态保持一致它实现了在抽象观察者Observer中定义的update()方法。通常在实现时可以调用具体目标类的attach()方法将自己添加到目标类的集合中或通过detach()方法将自己从目标类的集合中删除。 观察者模式结构中通常包括观察目标和观察者两个继承层次结构其结构如图22-3所示 观察者模式描述了如何建立对象与对象之间的依赖关系以及如何构造满足这种需求的系统。观察者模式包含观察目标和观察者两类对象一个目标可以有任意数目的与之相依赖的观察者一旦观察目标的状态发生改变所有的观察者都将得到通知。作为对这个通知的响应每个观察者都将监视观察目标的状态以使其状态与目标状态同步这种交互也称为发布-订阅(Publish-Subscribe)。观察目标是通知的发布者它发出通知时并不需要知道谁是它的观察者可以有任意数目的观察者订阅它并接收通知。 下面通过示意代码来对该模式进行进一步分析。首先我们定义一个抽象目标Subject典型代码如下所示 import java.util.; abstract class Subject {//定义一个观察者集合用于存储所有观察者对象 protected ArrayList observersObserver new ArrayList();//注册方法用于向观察者集合中增加一个观察者public void attach(Observer observer) {observers.add(observer); }//注销方法用于在观察者集合中删除一个观察者public void detach(Observer observer) {observers.remove(observer); }//声明抽象通知方法public abstract void notify(); }具体目标类ConcreteSubject是实现了抽象目标类Subject的一个具体子类其典型代码如下所示 class ConcreteSubject extends Subject {//实现通知方法public void notify() {//遍历观察者集合调用每一个观察者的响应方法for(Object obs:observers) {((Observer)obs).update();}} }抽象观察者角色一般定义为一个接口通常只声明一个update()方法为不同观察者的更新响应行为定义相同的接口这个方法在其子类中实现不同的观察者具有不同的响应方法。抽象观察者Observer典型代码如下所示 interface Observer {//声明响应方法public void update(); }在具体观察者ConcreteObserver中实现了update()方法其典型代码如下所示 class ConcreteObserver implements Observer {//实现响应方法public void update() {//具体响应代码} }在有些更加复杂的情况下具体观察者类ConcreteObserver的update()方法在执行时需要使用到具体目标类ConcreteSubject中的状态属性因此在ConcreteObserver与ConcreteSubject之间有时候还存在关联或依赖关系在ConcreteObserver中定义一个ConcreteSubject实例通过该实例获取存储在ConcreteSubject中的状态。如果ConcreteObserver的update()方法不需要使用到ConcreteSubject中的状态属性则可以对观察者模式的标准结构进行简化在具体观察者ConcreteObserver和具体目标ConcreteSubject之间无须维持对象引用。如果在具体层具有关联关系系统的扩展性将受到一定的影响增加新的具体目标类有时候需要修改原有观察者的代码在一定程度上违反了“开闭原则”但是如果原有观察者类无须关联新增的具体目标则系统扩展性不受影响。 3.4. 时序图 3.5. 代码分析 为了实现对象之间的联动Sunny软件公司开发人员决定使用观察者模式来进行多人联机对战游戏的设计其基本结构如图22-4所示
3.5.1 生产 在图22-4中AllyControlCenter充当目标类ConcreteAllyControlCenter充当具体目标类Observer充当抽象观察者Player充当具体观察者。完整代码如下所示 package com.zyz.demo;import java.util.ArrayList;/**
author zyz* version 1.0* data 2023/5/26 18:43* Description:/ interface Observer {public String getName();public void setName(String name);public void help(); //声明支援盟友方法public void beAttacked(AllyControlCenter acc); //声明遭受攻击方法 }//战队成员类具体观察者类class Player implements Observer {private String name;public Player(String name) {this.name name;}Overridepublic String getName() {return this.name;}Overridepublic void setName(String name) {this.name name;}/** 支援盟友方法的实现/Overridepublic void help() {System.out.println(坚持住 this.name 来救你);}/** 遭受攻击方法的实现当遭受攻击时将调用战队控制中心类的通知方法notifyObserver()来通知盟友** param acc/Overridepublic void beAttacked(AllyControlCenter acc) {System.out.println(this.name 被攻击);acc.notifyObserver(name);}}//战队控制中心类目标类abstract class AllyControlCenter {protected String allyName; //战队名称protected ArrayListObserver players new ArrayListObserver(); //定义一个集合用于存储战队成员public void setAllyName(String allyName) {this.allyName allyName;}public String getAllyName() {return this.allyName;}/** 注册方法** param obs/public void join(Observer obs) {System.out.println(obs.getName() 加入 this.allyName 战队);players.add(obs);}/** 注销方法** param obs/public void quit(Observer obs) {System.out.println(obs.getName() 退出 this.allyName 战队);players.remove(obs);}/** 声明抽象通知方法** param name/public abstract void notifyObserver(String name); }class ConcreteAllyControlCenter extends AllyControlCenter {public ConcreteAllyControlCenter(String allyName) {System.out.println(allyName 战队组建成功);System.out.println(—————————-);this.allyName allyName;}/** //实现通知方法** param name/Overridepublic void notifyObserver(String name) {System.out.println(this.allyName 战队紧急通知盟友 name 遭受敌人攻击);//遍历观察者集合调用每一个盟友自己除外的支援方法for (Object obs : players) {if (!((Observer) obs).getName().equalsIgnoreCase(name)) {((Observer) obs).help();}}} }3.5.2 客户端 package com.zyz.demo;/** author zyz* version 1.0* data 2023/5/26 18:52* Description: 客户端*/ class Client {public static void main(String args[]) {//定义观察目标对象AllyControlCenter acc;acc new ConcreteAllyControlCenter(金庸群侠);//定义四个观察者对象Observer player1,player2,player3,player4;player1 new Player(杨过);acc.join(player1);player2 new Player(令狐冲);acc.join(player2);player3 new Player(张无忌);acc.join(player3);player4 new Player(段誉);acc.join(player4);//某成员遭受攻击player1.beAttacked(acc);} }3.5.3 测试结果 在本实例中实现了两次对象之间的联动当一个游戏玩家Player对象的beAttacked()方法被调用时将调用AllyControlCenter的notifyObserver()方法来进行处理而在notifyObserver()方法中又将调用其他Player对象的help()方法。Player的beAttacked()方法、AllyControlCenter的notifyObserver()方法以及Player的help()方法构成了一个联动触发链执行顺序如下所示 Player.beAttacked() – AllyControlCenter.notifyObserver() –Player.help()。 3.6. 模式分析 观察者模式描述了如何建立对象与对象之间的依赖关系如何构造满足这种需求的系统。这一模式中的关键对象是观察目标和观察者一个目标可以有任意数目的与之相依赖的观察者一旦目标的状态发生改变所有的观察者都将得到通知。作为对这个通知的响应每个观察者都将即时更新自己的状态以与目标状态同步这种交互也称为发布-订阅(publishsubscribe)。目标是通知的发布者它发出通知时并不需要知道谁是它的观察者可以有任意数目的观察者订阅它并接收通知。 3.7. 实例 3.8. 优点 观察者模式的优点 观察者模式可以实现表示层和数据逻辑层的分离并定义了稳定的消息更新传递机制抽象了更新接口使得可以有各种各样不同的表示层作为具体观察者角色。观察者模式在观察目标和观察者之间建立一个抽象的耦合。观察者模式支持广播通信。观察者模式符合“开闭原则”的要求。 3.9. 缺点 观察者模式的缺点 如果一个观察目标对象有很多直接和间接的观察者的话将所有的观察者都通知到会花费很多时间。如果在观察者和观察目标之间有循环依赖的话观察目标会触发它们之间进行循环调用可能导致系统崩溃。观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的而仅仅只是知道观察目标发生了变化。 3.10. 适用环境 在以下情况下可以使用观察者模式 一个抽象模型有两个方面其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。一个对象的改变将导致其他一个或多个对象也发生改变而不知道具体有多少对象将发生改变可以降低对象之间的耦合度。一个对象必须通知其他对象而并不知道这些对象是谁。需要在系统中创建一个触发链A对象的行为将影响B对象B对象的行为将影响C对象……可以使用观察者模式创建一种链式触发机制。 3.11. 模式应用 观察者模式在软件开发中应用非常广泛如某电子商务网站可以在执行发送操作后给用户多个发送商品打折信息某团队战斗游戏中某队友牺牲将给所有成员提示等等凡是涉及到一对一或者一对多的对象交互场景都可以使用观察者模式。 3.12. 模式扩展 MVC模式 MVC模式是一种架构模式它包含三个角色模型(Model)视图(View)和控制器(Controller)。观察者模式可以用来实现MVC模式观察者模式中的观察目标就是MVC模式中的模型(Model)而观察者就是MVC中的视图(View)控制器(Controller)充当两者之间的中介者(Mediator)。当模型层的数据发生改变时视图层将自动改变其显示内容。 3.13. 总结 观察者模式定义对象间的一种一对多依赖关系使得每当一个对象状态发生改变时其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅模式、模型-视图模式、源-监听器模式或从属者模式。观察者模式是一种对象行为型模式。 观察者模式包含四个角色目标又称为主题它是指被观察的对象具体目标是目标类的子类通常它包含有经常发生改变的数据当它的状态发生改变时向它的各个观察者发出通知观察者将对观察目标的改变做出反应在具体观察者中维护一个指向具体目标对象的引用它存储具体观察者的有关状态这些状态需要和具体目标的状态保持一致。观察者模式定义了一种一对多的依赖关系让多个观察者对象同时监听某一个目标对象当这个目标对象的状态发生变化时会通知所有观察者对象使它们能够自动更新。观察者模式的主要优点在于可以实现表示层和数据逻辑层的分离并在观察目标和观察者之间建立一个抽象的耦合支持广播通信其主要缺点在于如果一个观察目标对象有很多直接和间接的观察者的话将所有的观察者都通知到会花费很多时间而且如果在观察者和观察目标之间有循环依赖的话观察目标会触发它们之间进行循环调用可能导致系统崩溃。观察者模式适用情况包括一个抽象模型有两个方面其中一个方面依赖于另一个方面一个对象的改变将导致其他一个或多个对象也发生改变而不知道具体有多少对象将发生改变一个对象必须通知其他对象而并不知道这些对象是谁需要在系统中创建一个触发链。在JDK的java.util包中提供了Observable类以及Observer接口它们构成了Java语言对观察者模式的支持。