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

上饶商城网站建设h5购物网站模板

上饶商城网站建设,h5购物网站模板,做网站需要多少钱呢,创意视觉网站Java8实战-总结34 重构、测试和调试使用 Lambda 重构面向对象的设计模式观察者模式责任链模式 重构、测试和调试 使用 Lambda 重构面向对象的设计模式 观察者模式 观察者模式是一种比较常见的方案#xff0c;某些事件发生时#xff08;比如状态转变#xff09;#xff0… Java8实战-总结34 重构、测试和调试使用 Lambda 重构面向对象的设计模式观察者模式责任链模式 重构、测试和调试 使用 Lambda 重构面向对象的设计模式 观察者模式 观察者模式是一种比较常见的方案某些事件发生时比如状态转变如果一个对象通常称之为主题需要自动地通知其他多个对象称为观察者就会采用该方案。创建图形用户界面GUI程序时经常会使用该设计模式。这种情况下在图形用户界面组件比如按钮上注册一系列的观察者。如果点击按钮观察者就会收到通知并随即执行某个特定的行为。 但是观察者模式并不局限于图形用户界面。比如观察者设计模式也适用于股票交易的情形多个券商可能都希望对某一支股票价格主题的变动做出响应。下图通过UML图解释了观察者模式。 为Twitter这样的应用设计并实现一个定制化的通知系统。想法很简单好几家报纸机构比如《纽约时报》《卫报》以及《世界报》都订阅了新闻他们希望当接收的新闻中包含他们感兴趣的关键字时能得到特别通知。首先需要一个观察者接口它将不同的观察者聚合在一起。它仅有一个名为notify的方法一旦接收到一条新的新闻该方法就会被调用 interface Observer { void notify(String tweet); } 现在可以声明不同的观察者比如这里是三家不同的报纸机构依据新闻中不同的关键字分别定义不同的行为 class NYTimes implements Observer { public void notify(String tweet) { if(tweet ! null tweet.contains(money)) { System.out.println(Breaking news in NY! tweet); } } } class Guardian implements Observer { public void notify(String tweet) { if(tweet ! null tweet.contains(queen)) { System.out.println(Yet another news in London... tweet); } } } class LeMonde implements Observer { public void notify(String tweet) { if(tweet ! null tweet.contains(wine)) { System.out.println(Today cheese, wine and news! tweet); } } } 最重要的部分是Subject,为它定义一个接口 interface Subject { void registerObserver(Observer o); void notifyObservers(String tweet); } Subject使用registerObserver方法可以注册一个新的观察者使用notifyObservers方法通知它的观察者一个新闻的到来。更进一步实现Feed类 class Feed implements Subject { private final ListObserver observers new ArrayList(); public void registerObserver(Observer o) { this.observers.add(o); } public void notifyObservers(String tweet) { observers.forEach(o - o.notify(tweet)); } }这是一个非常直观的实现Feed类在内部维护了一个观察者列表一条新闻到达时它就进行通知。 Feed f new Feed(); f.registerObserver(new NYTimes()); f.registerObserver(new Guardian()); f.registerObserver(new LeMonde()); f.notifyObservers(The queen said her favourite book is Java 8 in Action!); 上面示例中《卫报》会特别关注这条新闻。 使用Lambda表达式 Observer接口的所有实现类都提供了一个方法notify。新闻到达时它们都只是对同一段代码封装执行。Lambda表达式的设计初衷就是要消除这样的僵化代码。使用Lambda表达式后无需显式地实例化三个观察者对象直接传递Lambda表达式表示需要执行的行为即可 f.registerObserver((String tweet) - { if(tweet ! null tweet.contains(money)) { System.out.println(Breaking news in NY! tweet); } }); f.registerObserver((String tweet) - { if(tweet ! null tweet.contains(queen)) { System.out.println(Yet another news in London... tweet); } }); 是否随时随地都可以使用Lambda表达式呢答案是否定的前文介绍的例子中Lambda适配得很好那是因为需要执行的动作都很简单因此才能很方便地消除僵化代码。但是观察者的逻辑有可能十分复杂它们可能还持有状态抑或定义了多个方法诸如此类。在这些情形下还是应该继续使用类的方式。 责任链模式 责任链模式是一种创建处理对象序列比如操作序列的通用方案。一个处理对象可能需要在完成一些工作之后将结果传递给另一个对象这个对象接着做一些工作再转交给下一个处理对象以此类推。 通常这种模式是通过定义一个代表处理对象的抽象类来实现的在抽象类中会定义一个字段来记录后续对象。一旦对象完成它的工作处理对象就会将它的工作转交给它的后继。代码中这段逻辑看起来是下面这样 public abstract class ProcessingObjectT { protected ProcessingObjectT successor; public void setSuccessor(ProcessingObjectT successor) { this.successor successor;} public T handle(T input) { T r handleWork(input); if(successor ! null) { return successor.handle(r); } return r; } abstract protected T handleWork(T input); } 下图以UML的方式阐释了责任链模式。 handle方法提供了如何进行工作处理的框架。不同的处理对象可以通过继承ProcessingObject类提供handleWork方法来进行创建。 下面看看如何使用该设计模式。可以创建两个处理对象它们的功能是进行一些文本处理工作。 public class HeaderTextProcessing extends ProcessingObjectString { public String handleWork(String text) { return From Raoul, Mario and Alan: text; } } public class SpellCheckerProcessing extends ProcessingObjectString { public String handleWork(String text) { return text.replaceAll(labda, lambda); } } 现在你就可以将这两个处理对象结合起来构造一个操作序列 ProcessingObjectString p1 new HeaderTextProcessing(); ProcessingObjectString p2 new SpellCheckerProcessing(); p1.setSuccessor(p2);//将两个处理对象链接起来String result p1.handle(Arent labdas really sexy?!!); System.out.println(result); //打印输出“From Raoul, Mario and Alan: Arent lambdas really sexy?!!使用Lambda表达式 可以将处理对象作为函数的一个实例为了链接这些函数需要使用andThen方法对其进行构造。 UnaryOperatorString headerProcessing (String text) - From Raoul, Mario and Alan: text; //第一个处理对象UnaryOperatorString spellCheckerProcessing (String text) - text.replaceAll(labda, lambda); //第二个处理对象FunctionString, String pipeline headerProcessing.andThen(spellCheckerProcessing); //将两个方法结合起来结果就是一个操作链String result pipeline.apply(Arent labdas really sexy?!!);
http://www.pierceye.com/news/533164/

相关文章:

  • 法治与安全做讲座网站系统工具
  • wap网站怎么做白石洲网站建设
  • 网站备案 关闭网站广州安全教育平台登录入囗
  • 做常州美食网站首页的背景图招聘网站建设费用多少
  • 制作网站需要wordpress网站的建设步骤包括什么
  • 有什么网站可以做微信支付宝支付宝闽侯县建设局网站
  • html5网站图标qq刷赞网站如何做分站
  • 免费asp网站源码下载网页视频怎么下载到本地视频手机
  • 深圳网站定制开发安徽建设人才网官网
  • 斐讯k3做网站工商注册名称核准查询
  • 兼职网站编辑深圳网站做的好的公司哪家好
  • 网站响应速度优化wordpress外贸主题购买
  • 没有后台的网站怎么做排名网页设计学校
  • 江苏网站建设哪家快点外贸商城网站系统
  • 菠菜网站做首存wordpress 警告
  • 无锡好的网站建设公司网站公司做的网站被攻击
  • 建设银行官方网站下载安装淘宝官网首页登录入口电脑
  • 玩具外贸网站扬中论坛全部帖子
  • 网站搭建规划建设网站方案ppt
  • 手机上哪个网站免费wordpress空间
  • 网站改版上线西安网站群搭建
  • 百度竞价培训青岛网站建设和优化
  • 网站建设 收费明细wordpress 动漫 主题下载
  • 物流网站怎么做推广wordpress插件ERP
  • 网站开发市场价手机改ip地址软件免费
  • 上海网站建设zj kt网站开发网络公司
  • 郑州平台网站建设福田欧曼图片
  • 企业网站策划应该怎么做杭州萧山网站建设
  • 南昌网站建设如何网站建设综合训练的实验目的
  • 连锁酒店网站建设软件开发分为哪几个步骤