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

网站关键词优化排名软件系统深圳宝安区核酸检测点

网站关键词优化排名软件系统,深圳宝安区核酸检测点,在门户网站上爆光怎么做,科技有限公司注册资金最低多少文章目录 前言一、中介者模式二、发布订阅模式三、备忘录模式 前言 本篇是关于设计模式中介者模式、观察者#xff08;发布-订阅#xff09;模式、以及备忘录模式的学习笔记。 一、中介者模式 中介者模式是一种行为型设计模式#xff0c;其核心目的是为了减少对象之间的复杂… 文章目录 前言一、中介者模式二、发布订阅模式三、备忘录模式 前言 本篇是关于设计模式中介者模式、观察者发布-订阅模式、以及备忘录模式的学习笔记。 一、中介者模式 中介者模式是一种行为型设计模式其核心目的是为了减少对象之间的复杂依赖关系将多个对象之间的交互逻辑封装到一个中介者对象中对象与对象之间不必直接发生关联就如同租房找中介机构由中介机构负责协调房东。   中介者模式一般包含以下的角色 抽象中介者类/接口通常定义了向同事类发送消息注册同事类的方法。中介者的具体实现通常维护一个同事类的集合并且拥有接收同事类消息并进行处理的方法。抽象同事类/接口持有一个中介者类的实例并且定义了向中介者类发送信息接受中介者类指令的方法模板。同事类的具体实现具体编写抽象同事类相关方法的逻辑。 下面举一个生活中的案例例如航空系统的运作飞机的起落时间航线高度都是由塔台去统一调度中介者而飞机(同事类和飞机之间一般是不会直接进行通信的。   定义一个抽象中介者类拥有 注册同事类的方法接受同事类的消息的方法 /*** 抽象中介者*/ public interface AirTrafficControl {void notify(String message,Airplane airplane);void registerAirplane(Airplane airplane); }抽象同事类 持有中介者对象向中介者发送消息接受中介者的消息 /*** 抽象同事类(持有中介者对象)*/ public abstract class Airplane {/*** 持有一个中介者对象*/AirTrafficControl airTrafficControl;String id;public Airplane(AirTrafficControl controlTower, String id) {this.airTrafficControl controlTower;this.id id;}/*** 向中介者发送消息* param message*/public abstract void sendMessage(String message);/*** 接受中介者的指令各个同事之间不发生联系接受中介者的统一调度* param message*/public abstract void receiveMessage(String message);}具体同事类 会将自己注册到中介者的同事类集合中向中介者发送消息接受中介者的指令各个同事之间不发生联系接受中介者的统一调度 /*** 持有中介者对象*/ public class ConcreteAirplane extends Airplane{public ConcreteAirplane(AirTrafficControl controlTower, String id) {super(controlTower, id);//将自己注册到中介者的同事类集合中airTrafficControl.registerAirplane(this);}/*** 向中介者发送消息** param message*/Overridepublic void sendMessage(String message) {System.out.println(飞机 id 发送消息: message);airTrafficControl.notify(message,this);}/*** 接受中介者的指令各个同事之间不发生联系接受中介者的统一调度** param message*/Overridepublic void receiveMessage(String message) {System.out.println(飞机 id 收到消息: message);} }具体中介者类 接受同事类的信息向同事类发送消息维护一个同事类的集合 /*** 具体中介者*/ public class ControlTower implements AirTrafficControl{/*** 维护一个同事类的集合*/ListAirplane airplaneList new ArrayList();/*** 接受同事类的信息* param message* param airplane*/Overridepublic void notify(String message, Airplane airplane) {for (Airplane a : airplaneList) {if (a ! airplane){a.receiveMessage(message);}}}Overridepublic void registerAirplane(Airplane airplane) {airplaneList.add(airplane);} }客户端 public class Client {public static void main(String[] args) {ControlTower controlTower new ControlTower();//创建具体的同事类ConcreteAirplane a101 new ConcreteAirplane(controlTower, A101);ConcreteAirplane b202 new ConcreteAirplane(controlTower, B202);ConcreteAirplane c303 new ConcreteAirplane(controlTower, C303);a101.sendMessage(准备降落请保持跑道空闲。);b202.sendMessage(正在滑行至停机坪。);} } 飞机 A101 发送消息: 准备降落请保持跑道空闲。 飞机 B202 收到消息: 准备降落请保持跑道空闲。 飞机 C303 收到消息: 准备降落请保持跑道空闲。 飞机 B202 发送消息: 正在滑行至停机坪。 飞机 A101 收到消息: 正在滑行至停机坪。 飞机 C303 收到消息: 正在滑行至停机坪。 从上面的案例可以看出中介者模式的核心就在于建立中介者和同事类之间的联系而各个同事类之间不互相联系。并且同事类需要持有中介者的对象中介者也需要维护所有同事类对象的集合。   这样做的好处在于修改交互逻辑只需更改中介者不影响同事类并且避免了对象之间复杂的网状引用。弊端在于业务逻辑集中在了中介者类中并且过于依赖中介者如果中介者故障系统交互可能中断。 二、发布订阅模式 发布订阅模式是一种消息传递模式在这种模式中消息的发送者发布者 和 消息的接收者订阅者 之间没有直接联系。取而代之的是一个中间“事件总线”或“消息代理”负责协调消息的传递。发布者将消息发送到总线总线根据订阅规则将消息推送给感兴趣的订阅者。   主要包含以下的角色 事件总线 负责管理订阅者和消息的传递。发布者 产生事件并发布到总线上。订阅者 注册到总线上接收感兴趣的事件。 例如现在有一个气象信息管理中台xx网站需要从该平台获取最新的天气信息。气象信息管理中台主动推送传统方式如下中台需要在自己的代码中维护所有订阅自己系统的数据并逐个发送通知 /*** 天气数据系统*/ public class WeatherDataSystem {private double temperature;private double pressure;private double humidity;private Sina sina;public WeatherDataSystem(Sina sina){this.sina sina;}public double getTemperature() {return temperature;}public double getPressure() {return pressure;}public double getHumidity() {return humidity;}public void refreshData(double temperature, double pressure, double humidity){this.temperature temperature;this.humidity humidity;this.pressure pressure;pushData();}private void pushData(){sina.update(getHumidity(),getTemperature(),getPressure());} } public class Sina {private double temperature;private double pressure;private double humidity;public void update(double humidity, double temperature, double pressure){this.temperature temperature;this.pressure pressure;this.humidity humidity;show();}private void show(){System.out.println(目前温度temperature);System.out.println(目前气压pressure);System.out.println(目前湿度humidity);} }这样做的弊端也是显而易见的如果后续有其他网站接入中台则需要不断地修改中台的代码将新的平台注册进来并且推送渠道也要增加新的平台。   使用发布-订阅模式进行改造则可以抽取一个发布者接口、监听者接口: public interface Subject {/*** 注册订阅者* param o*/void registerObservers(Observer o);/*** 移除订阅者* param o*/void removeObservers(Observer o);/*** 通知所有订阅者*/void notifyObserver(); } /*** 监听者接口* 定义监听者共有的行为*/ public abstract class Observer {private Subject subject;public Observer(Subject subject) {this.subject subject;}abstract void update(double temperature, double pressure, double humidity); } 信息的发布者用户中台实现发布者接口 /*** 气象数据系统*/ public class WeatherData implements Subject{private double temperature;private double pressure;private double humidity;private ListObserver observers;public WeatherData() {this.observers new ArrayList();}/*** 注册订阅者** param o*/Overridepublic void registerObservers(Observer o) {observers.add(o);}/*** 移除订阅者** param o*/Overridepublic void removeObservers(Observer o) {observers.remove(o);}/*** 通知所有订阅者*/Overridepublic void notifyObserver() {for (Observer observer : observers) {//调用监听者共有的行为observer.update(temperature,pressure,humidity);}}public void refreshData(double temperature, double pressure, double humidity){this.temperature temperature;this.humidity humidity;this.pressure pressure;notifyObserver();} } 具体的网站作为接收者可以将自身注册到发布者上 /*** 订阅者*/ public class Baidu extends Observer {private double temperature;private double pressure;private double humidity;public Baidu(Subject subject) {super(subject);subject.registerObservers(this);}Overridepublic void update(double temperature, double pressure, double humidity) {this.temperature temperature;this.humidity humidity;this.pressure pressure;show();}public void show(){System.out.println(百度天气目前气温temperature);System.out.println(百度天气目前气压pressure);System.out.println(百度天气目前湿度humidity);} }客户端 public class Client {public static void main(String[] args) {WeatherData weatherData new WeatherData();new Baidu(weatherData);weatherData.refreshData(33.2,100,22.5);} } 百度天气目前气温33.2 百度天气目前气压100.0 百度天气目前湿度22.5 使用发布-订阅模式改造后的代码如果后续有新的订阅者去订阅中台则中台的代码不需要修改新的订阅者只需要将自身注册到中台即可。如果取消订阅也一样。   这样做的好处在于发布者和订阅者无需直接通信解除了耦合并且可以动态增加或移除订阅者和主题。常见的消息队列Kafka、RabbitMQ中间件就是该设计模式的体现。 三、备忘录模式 备忘录模式是一种行为型设计模式核心思想在于不破坏封装的前提下保存和恢复对象的状态。通过保存对象状态的快照备忘录模式允许用户在需要时将对象恢复到之前的状态。备忘录模式常用于需要“撤销”和“恢复”功能的场景例如文本编辑器、游戏存档等。   通常会包含以下角色 备忘录 用于存储发起者对象的内部状态。发起者 创建备忘录并可以从中恢复其状态。管理者 负责保存和管理备忘录但不会直接操作或修改备忘录的内容。 举一个生活中的案例例如游戏的存档功能我们首先创建一个对象代表游戏角色,在该对象中除了基本的属性还定义了 创建备忘录对象传递自身某一时刻的状态。从备忘录中获取状态并赋值给属性。 public class Role {/*** 攻击力*/private String attackPower;/*** 防御力*/private String defenseCapability;/*** 版本*/private int version;public Role() {}public Role(String attackPower, String defenseCapability, int version) {this.attackPower attackPower;this.defenseCapability defenseCapability;this.version version;}/*** 设置* param attackPower*/public void setAttackPower(String attackPower) {this.attackPower attackPower;}/*** 设置* param defenseCapability*/public void setDefenseCapability(String defenseCapability) {this.defenseCapability defenseCapability;}/*** 设置* param version*/public void setVersion(int version) {this.version version;}public String getAttackPower() {return attackPower;}public String getDefenseCapability() {return defenseCapability;}public int getVersion() {return version;}/*** 创建备忘录* return*/public Memo createMemo(){return new Memo(attackPower,defenseCapability,version);}/*** 回退到指定的版本* param memo*/public void getMemo(Memo memo){this.attackPower memo.getAttackPower();this.defenseCapability memo.getDefenseCapability();this.version memo.getVersion();}}备忘录对象是游戏角色某一时刻的快照包含了游戏角色的属性。 public class Memo {/*** 攻击力*/private String attackPower;/*** 防御力*/private String defenseCapability;/*** 版本*/private int version;public Memo() {}public Memo(String attackPower, String defenseCapability, int version) {this.attackPower attackPower;this.defenseCapability defenseCapability;this.version version;}public String getAttackPower() {return attackPower;}public String getDefenseCapability() {return defenseCapability;}public int getVersion() {return version;} }备忘录对象的统一管理类因为存档可能有多份所以使用一个集合进行管理 public class Caretaker {private ListMemo memoList new ArrayList();public void add(Memo memo){memoList.add(memo);}public Memo rollback(int reversion){return memoList.get(reversion);} }客户端 public class Client {public static void main(String[] args) {Caretaker caretaker new Caretaker();Role role new Role(1w,5k,0);System.out.println(初始状态角色攻击role.getAttackPower()角色防御role.getDefenseCapability());caretaker.add(role.createMemo());role.setAttackPower(8k);role.setDefenseCapability(4.5k);role.setVersion(1);System.out.println(第一次大战结束角色攻击role.getAttackPower()角色防御role.getDefenseCapability());caretaker.add(role.createMemo());role.setAttackPower(1k);role.setDefenseCapability(0.5k);role.setVersion(2);System.out.println(第二次大战结束角色攻击role.getAttackPower()角色防御role.getDefenseCapability());caretaker.add(role.createMemo());Memo rollback caretaker.rollback(0);System.out.println(回溯到初始状态角色攻击rollback.getAttackPower()角色防御rollback.getDefenseCapability());} }初始状态角色攻击1w角色防御5k 第一次大战结束角色攻击8k角色防御4.5k 第二次大战结束角色攻击1k角色防御0.5k 回溯到初始状态角色攻击1w角色防御5k 这样做的好处在于 备忘录存储状态的细节完全对管理者隐藏并且可以维护多个备忘录以实现多级撤销。通常适用于需要撤销/恢复功能以及对象状态需要存档的场景。
http://www.w-s-a.com/news/890673/

相关文章:

  • 织梦做商城网站企业网络建站
  • 网站后期维护都有什么wordpress首页加图片
  • 展会网站怎么做网页设计与制作教程版徐洪亮课后答案
  • 石景山网站建设设计公司建设网站怎么建立服务器
  • 本地生活服务平台app网站关键词优化原理
  • 建网站的公司叫什么重庆论坛建站模板
  • 湖北网站制作公司银川网站建设哪家不错
  • 网站后台演示地址服装网站建设公司推荐
  • 湖北钟祥建设局网站旅游哪个网站最好
  • 浙江建设工程信息网站辽宁建设工程信息网场内业绩什么意思
  • 郑州做网站公司 汉狮网络专业图片搜集网站怎么做
  • 网站托管是什么品牌推广营销平台
  • 制作网站的难度贵州省兴义市建设局网站
  • 永春建设局网站室内设计师培训班学费多少
  • 做仿站如何获取网站源码windows2012做网站
  • 网站建设最好的公司东莞外贸网站
  • 普兰店网站建设一般做网站什么价格
  • 网站建设的发展目标甘肃网站设计公司
  • 常州西站建设规划室内装修设计学校哪里好
  • 大连网站制作选择ls15227如何编辑网站
  • 网站发稿平台迪士尼网站是谁做的
  • 常州有哪些好的网站建设案例wordpress 360 插件
  • 模板网站有后台么柳城网站建设
  • 地方门户网站制作一级做c爱片的网站
  • 自己上传图片做动漫图网站北京福田汽车
  • 一级a做爰片免费网站录像ps做网站图片水印
  • 网页广告投放成都优化推广公司
  • 网站开发 印花税网页制作站点
  • 创建个人网站有什么好处国外建站系统
  • 桂林学校网站制作2018年网站设计公司