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

长春网站推广优化网页界面设计的理念

长春网站推广优化,网页界面设计的理念,泰州seo网站推广,州网站建设概述 前面已经学习了创建型和结构性设计模式#xff0c;从本章开始开始学习行为型设计模式。创建型设计模式主要解决 “对象的创建” 问题#xff0c;结构性设计模式主要解决 “类或对象的组合或组装” 问题#xff0c;行为型设计模式主要解决 “类或对象之间的交互” 问题…概述 前面已经学习了创建型和结构性设计模式从本章开始开始学习行为型设计模式。创建型设计模式主要解决 “对象的创建” 问题结构性设计模式主要解决 “类或对象的组合或组装” 问题行为型设计模式主要解决 “类或对象之间的交互” 问题。 行为型设计模式比较多有 11 个基于占了 23 种设计模式的一半。它们分别是观察者模式、模版模式、策略模式、职责链模式、状态模式、迭代器模式、访问者模式、备忘录模式、命令模式、解释器模式、中介模式。 本章学习第一个行为型设计模式也是应用的最广泛的一种设计模式观察者模式。观察者模式有不同的代码实现方式同步阻塞的实现方式、异步非阻塞的实现方式进程内的实现方式也有跨进程的实现方式。本章重点讲解原理、实现、应用场景。下章会实现一个基于观察者模式的异步非阻塞的 EventBus加深你对这个模式的理解。 原理及应用场景剖析 观察者模式Observer Design Pattern也成为发布订阅模式Publish-Subscribe Design Pattern。GoF 的《设计模式》是这样定义的 Define a one-to-many dependency between objects so that when one object changes state,all it’s dependents are notified and updated automatically. 翻译成中文定义一个一对多的依赖当一个对象状态改变的时候所有依赖的对象都会收到通知。 一般情况下被依赖的对象叫做被观察者Observable依赖的对象叫做观察者Observer。不过在实际的开发中这两种对象的称呼比较灵活比如Subject-Observer、Publisher-Subscribe、Producer-Consumer、EventEmitter-EventListener、Dispatcher-Listener。不管怎么称呼只要应用场景符合刚刚的定义都可以看做观察者模式。 实际上观察者模式是一个比较抽象的模式根据不同的应用场景有完全不同的实现方式。现在先来看其中最经典的一种实现方式。这也是在讲到观察者模式时很多书籍给出的最常见的实现方式。其代码如下所示 public interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers(Message message); }public interface Observer {void update(Message message); }public class ConcreteSubject implements Subject {private static ListObserver observers new ArrayList();Overridepublic void registerObserver(Observer observer) {observers.add(observer);}Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}Overridepublic void notifyObservers(Message message) {for (Observer observer : observers) {observer.update(message);}} }public class ConcreteObserverOne implements Observer {Overridepublic void update(Message message) {// 获取消息通知执行自己的逻辑System.out.println(ConcreteObserverOne is notified.);} }public class ConcreteObserverTwo implements Observer {Overridepublic void update(Message message) {// 获取消息通知执行自己的逻辑System.out.println(ConcreteObserverTwo is notified.);} }public class Demo {public static void main(String[] args) {ConcreteSubject subject new ConcreteSubject();subject.registerObserver(new ConcreteObserverOne());subject.registerObserver(new ConcreteObserverTwo());subject.notifyObservers(new Message());} }实际上上面的代码算式观察者模式的 “模版代码”只能反映大体的设计思路。在真实的软件开发中并不需要照搬上面的代码。观察者模式的实现方法各式各样函数、类的命名等会根据业务场景的不同有很大的差别比如 register 函数还可以叫做 attachremove 函数还可以叫做 detach 等等。不过万变不离其宗设计思路都是差不多的。 原理和代码实现都非常简单不需要过多解释。我们还是通过一个例子来重点讲下什么情况下需要用到这种设计模式 假设要开发一个 P2P 投资理财系统用户注册成功之后我们会给用户发放投资体验金。代码实现大致是下面这样子的 public class UserController {private UserService userService; // 依赖注入private PromotionService promotionService; //依赖注入public long register(String telephone, String password) {// 省略输入参数的校验代码// 省略userService.register()异常的try-catch代码long userId userService.register(telephone, password);promotionService.issueNewUserExperienceCash(userId);return userId;} }虽然注册接口做了两件事情注册和发放体验金违反单一职责原则但是如果没有扩展和修改的需求现在的代码实现是可以接受的。如果非得用观察者模式就需要引入更多的类和更加复杂的代码结构反倒是一种过度设计。 如果需求频繁改动比如用户注册成功之后不在发放体验券而是改为发放优惠券并且还要给用户发送一封 “欢迎注册成功” 的站内信。这种情况下就需要频繁地修改 register() 函数中的代码违反开闭原则。而且如果注册成功之后需要执行的后续操作越来越多那 register() 函数的逻辑会变得越来越复杂也就影响到代码的可读性和可维护性。 此时观察者模式就派上用场了。利用观察者模式对上面的代码进行重构。 public interface RegObserver {void handleRegSuccess(long userId); }public class RegPromotionObserver implements RegObserver {private PromotionService promotionService; // 依赖注入Overridepublic void handleRegSuccess(long userId) {promotionService.issueNewUserExperienceCash(userId);} }public class RegNotificationObserver implements RegObserver {private NotificationService notificationService;Overridepublic void handleRegSuccess(long userId) {notificationService.senInboxMessage(userId, Welcome ...);} }public class UserController {private ListRegObserver regObservers new ArrayList();private UserService userService; // 依赖注入// 一次性设置好之后也不可能动态地修改public void setRegObservers(ListRegObserver observers) {regObservers.addAll(observers);}public long register(String telephone, String password) {// 省略输入参数的校验代码// 省略userService.register()异常的try-catch代码long userId userService.register(telephone, password);for (RegObserver observer : regObservers) {observer.handleRegSuccess(userId);}return userId;} }当我们需要添加观察者时比如用户注册成功之后推送用户注册信息给大数据征信系统基于观察者模式的代码实现 UserController 类的 register() 函数完全不需要修改只需要再添加一个实现 RegObserver 接口的类并通过 setRegObservers() 函数将它注册到 UserController 类中即可。 前面已经学习了很多设计模式不知道你发现没有实际上设计模式要干的事情就是解耦。创建型模式是将创建和使用代码解耦结构型模式是将不同功能代码解耦行为型模式是将不同的行为代码解耦再具体到观察者模式它是将观察者和被观察者解耦。 借助设计模式利用更好的代码结构将一大坨代码拆分成职责更单一的小类让其满足开闭原则、高内聚松耦合等特性依此来控制代码的复杂性提高代码的可扩展性。 基于不同应用场景的不同实现方式 观察者模式的应用场景非常广泛小到代码层面解耦大到架构层面的系统解耦再或者一些产品的设计思路都有这种模式的影子比如邮件订阅、Rss Feeds本质上都是观察者模式。 不同的应用场景和需求下这个模式也有截然不同的实现方式上一小节我们提到有同步阻塞的实现方式也有异步非阻塞的实现方式有进程内的实现方式也有跨进程的实现方式。 第一小节例子中的实现方式是一种同步阻塞的实现方式。观察者和被观察者代码在同一个线程内执行被观察者一直阻塞直到所有的观察者代码都执行完成之后才执行后续的代码。对照上面讲到的用户注册的例子 register() 函数依次调用执行每个观察者的 handleRegSuccess() 函数最后才返回结果给客户端。 如果注册接口是一个调用比较频繁地接口对性能非常敏感希望接口响应时间尽可能短那我们可以将同步阻塞的实现方式改为异步非阻塞的实现方式依此来减少响应时间。具体来讲当 userService.register() 函数执行完成之后我们启动一个新的线程开执行观察者的 handleRegSuccess() 函数这样 userController.register() 函数不要等到所有的 handleRegSuccess() 函数都执行完成之后才返回结果给客户端。userController.register() 函数从执行 3 个 SQL 才返回减少到只需要执行 1 个 SQL 语句就返回响应时间粗略地讲减少为原来的 1/3。 如何实现一个异步非阻塞的观察者模式呢简单的做法是在每个 handleRegSuccess() 函数中创建一个新线程执行代码。不过我们还有更加优雅的实现方式那就是基于 EventBus 来实现。 刚刚提到的两个场景不管是同步阻塞实现方式还是异步非阻塞实现方式都是进程内的实现方式。如果用户注册成功之后我们需要发送用户信息给大数据征信系统而大数据征信系统是一个独立的系统跟它之间的交互是跨不同进程的那如何实现一个跨进程的观察者模式呢 如果大数据征信系统提供了发送用户注册信息的 RPC 接口仍然可以沿用之前的实现思路在 handleRegSuccess() 函数中调用 RPC 接口来发送数据。但是我们还有更加优雅、更加常用的一种实现方式那就是基于消息队列比如 ActiveMQ来实现。 当然这种实现方式也有弊端那就是需要引入一个新的系统消息队列增加了维护成本。不过它的好处也非常明显。在原来的实现方式中观察者需要注册到被观察者需要依次遍历观察者来发送消息。而基于消息队列的实现方式被观察者和观察者解耦更加彻底两部分的耦合更小。被观察者完全不感知观察者同理观察者也完全不感知被观察者。被观察者只管发送消息到消息队列观察者只管从消息队列中读取消息来执行相应的逻辑。 总结 设计模式要干的事情就是解耦创建型模式是将创建和使用代码解耦结构性模式是将不同功能代码解耦行为性模式是将不同行为解耦具体到观察者模式它将观察者和被观察者代码解耦。借助设计模式我们利用更好的代码结构将一大坨代码拆分成职责更单一的小类让其满足开闭原则、高内聚低耦合等特性依此来控制和应对代码的复杂性提高代码的可扩展性。 观察者模式的应用场景非常广泛小到代码层面的解耦大到框架层面的解耦再或者一些产品的设计思路都有观察者模式的影子这个模式也有截然不同的实现方式有同步阻塞的实现方式也有异步非阻塞的实现方式有进程内的实现方式也有跨进程的实现方式。
http://www.pierceye.com/news/69333/

相关文章:

  • 旺道seo优化软件seo推广有用吗
  • 广西人才网官方网站朝阳企业网站建设方案
  • 宋家庄网站建设做网站不错的公司
  • 网站建设可行性分析报告范文做网站的公司什么动力
  • 英文建设网站.net建设网站步骤详解
  • 英国做电商网站有哪些大连网站建设流程图
  • 成都网站制作培训多少钱怎么样建设企业网站
  • 潍坊专业网站建设哪家便宜wordpress电视剧
  • 优秀网站赏析做公司+网站建设
  • php网站开发教学哪些论坛是wordpress
  • 传智播客php网站开发实例教程昆明网站建设猫咪
  • 嘉兴网站系统总部百度导航下载2022最新版官网
  • 孝感市建设局网站wordpress自动添加关键字
  • 一级a做爰网站二级学院网站建设及利用情况
  • 北京优质网站制作wordpress登录logo
  • 一流网站模板网站建设管理工作情况报告
  • 天津网站建设需要多少钱想学网站搭建与推广
  • 密山网站如何一个空间放两个网站
  • 好的网站设计培训班佛山网站建设公司价格
  • 揭阳网站设计制作wordpress怎么上传文件
  • 站多多 福州网站建设做网站都是花钱吗
  • 微信公众号微网站怎么建设潍坊建网站
  • 孟村县网站建设工厂视频网站建设
  • 做网站域名解析深圳手机网站模板
  • 有什么做海报网站盐城市建设局网站设计备案资料
  • server2008 做网站html5移动网站模板
  • 甘肃省长城建设集团网站网站建设与准备
  • 什么是企业营销型网站深圳百度网站优化
  • 深圳前十网站扩广公司网站模板下载百度云链接怎么做
  • 永泰县建设局网站贵安新区微信网站建设