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

政府网站建设交流材料网站推广策略有哪些

政府网站建设交流材料,网站推广策略有哪些,建设网站宽度最好是多少,汽车网络营销方式目录1 中介模式详解1.1 中介模式的定义1.1.1 中介者模式在生活场景中应用1.1.2 中介者模式的使用场景1.2 中介模式的通用实现1.2.1 类图设计1.2.2 代码实现1.3 中介模式应用案例之聊天室1.3.1 类图设计1.3.2 代码实现1.4 中介者模式在源码中应用1.4.1 jdk中Timer类1.5 中介者模…

目录

  • 1 中介模式详解
    • 1.1 中介模式的定义
      • 1.1.1 中介者模式在生活场景中应用
      • 1.1.2 中介者模式的使用场景
    • 1.2 中介模式的通用实现
      • 1.2.1 类图设计
      • 1.2.2 代码实现
    • 1.3 中介模式应用案例之聊天室
      • 1.3.1 类图设计
      • 1.3.2 代码实现
    • 1.4 中介者模式在源码中应用
      • 1.4.1 jdk中Timer类
    • 1.5 中介者模式使用总结
      • 1.5.1 优缺点总结
      • 1.5.2 与其他模式的关系总结
  • 2 解释器模式详解
    • 2.1 解释器模式的定义
      • 2.1.1 解释器模式在生活场景中应用
      • 2.1.2 解释器模式的适用场景
    • 2.2 解释器模式的通用实现
      • 2.2.1 类图设计
      • 2.2.2 代码实现
    • 2.3 解释器模式实现案例之计算器功能
      • 2.3.1 类图设计
      • 2.3.2 代码实现
      • 2.3.3 解释器模式在源码中应用
      • 2.4.4 spring中ExpressionParser
    • 2.5 解释器模式的使用总结
      • 2.5.1 优缺点总结


1 中介模式详解

1.1 中介模式的定义

定义:

中介者模式【Mediator Pattern】,又称调解者模式或调停者模式。用一个中介对象封装一系列的对象

交互,中介者使用各对象不需要显式地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

核心:

通过中介者解耦系统各层次对象的直接耦合,层次对象的对外依赖通信统统交由中介者转发。

属于行为型模式。

1.1.1 中介者模式在生活场景中应用

1.人际交往圈,通讯网络。如果需要自己逐个去建立关系会很困难且复杂,如果加入中介者,来维护这个网络。

中介者就很方便了。

2.朋友圈。

3.数据整合中心

4.rpc通信

1.1.2 中介者模式的使用场景

1.系统中对象之间存在复杂的引用关系,产生相互依赖关系结构混乱且难以理解。

2.交互的公共行为,如果需要改变行为则可以增加新的中介者类。

1.2 中介模式的通用实现

1.2.1 类图设计

img

1.2.2 代码实现

1.3 中介模式应用案例之聊天室

很多人进入一个聊天室,或聊天群里,群或聊天室,都充当中介者的角色。

1.3.1 类图设计

img

说明:

这里通过用户名,表示不同用户。

1.3.2 代码实现

1.中介者【聊天室】

package com.oldlu.mediator.demo.chatroom;/*** @ClassName ChatRoom* @Description 聊天室* @Author oldlu* @Version 1.0*/
public class ChatRoom {public void showMsg(User user,String message){System.out.println("【"+user.getName() +"】,传达信息:"+message);}
}

它就只是一个传话者,把信息发布者的内容,传达出来。

2.用户类【聊天者】

package com.oldlu.mediator.demo.chatroom;/*** @ClassName User* @Description 用户类* @Author oldlu* @Version 1.0*/
public class User {private ChatRoom chatRoom;private String name;public String getName() {return name;}public User(String name,ChatRoom chatRoom) {this.chatRoom = chatRoom;this.name = name;}public void sendMessage(String msg){//用户传达信息,通过聊天室this.chatRoom.showMsg(this, msg);}
}

3.测试类

package com.oldlu.mediator.demo.chatroom;/*** @ClassName Test* @Description 测试类* @Author oldlu* @Version 1.0*/
public class Test {public static void main(String[] args) {ChatRoom chatRoom  = new ChatRoom();User tom = new User("Tom",chatRoom);User jerry = new User("Jerry",chatRoom);tom.sendMessage("大家好,我是"+tom.getName()+"欢迎大家,进入聊天室");jerry.sendMessage("大家好,我是"+jerry.getName()+"欢迎大家,进入聊天室");}
}

测试结果:

img

1.4 中介者模式在源码中应用

1.4.1 jdk中Timer类

private void sched(TimerTask task, long time, long period) {if (time < 0)throw new IllegalArgumentException("Illegal execution time.");// Constrain value of period sufficiently to prevent numeric// overflow while still being effectively infinitely large.if (Math.abs(period) > (Long.MAX_VALUE >> 1))period >>= 1;synchronized(queue) {if (!thread.newTasksMayBeScheduled)throw new IllegalStateException("Timer already cancelled.");synchronized(task.lock) {if (task.state != TimerTask.VIRGIN)throw new IllegalStateException("Task already scheduled or cancelled");task.nextExecutionTime = time;task.period = period;task.state = TimerTask.SCHEDULED;}queue.add(task);if (queue.getMin() == task)queue.notify();}}

Timer类中有多个schedule重载方法,内部都调用sched方法,Timer本身是没有做什么事的。

它只是调用Quequ队列add,把TimerTask添加进去。所以,Timer充当中介者的角色。

1.5 中介者模式使用总结

1.5.1 优缺点总结

优点:

1.减少类间依赖,将多对多依赖关系,转化成一对多的关系,降低了类间的耦合性。

2.类间各司其职,符合迪米特法则。

缺点:

中介者模式,将原本多个对象直接的相互依赖关系,变成依赖中介者和多个同事类的依赖关系。

当同事类越来越多时,中介者责任越来越大,且复杂难以维护。

1.5.2 与其他模式的关系总结

中介者模式和代理模式的区别:

1.都存在中间角色。

2.代理模式,着重在代理【增强功能】

3.中介者模式,只他帮你联系上了,就不管了,后面的事情全权由自己完成。【只管搭桥】

2 解释器模式详解

2.1 解释器模式的定义

定义:

解释器模式【Interpretor Pattern】给定一个语言,定义它的文法的一种表示,并定义解释器。

这个解释器使用该表示来解释语言中的句子。

特征:

为了解释一种语言,而为语言创建的解释器。

属于行为型模式。

2.1.1 解释器模式在生活场景中应用

1.音乐简谱

2.摩斯密码

2.1.2 解释器模式的适用场景

1.一些重复出现的问题可以一种简单的语言来进行表达

2.一个简单的语法 需要解释的场景

2.2 解释器模式的通用实现

2.2.1 类图设计

2.2.2 代码实现

2.3 解释器模式实现案例之计算器功能

2.3.1 类图设计

img

2.3.2 代码实现

1.计算器功能

package com.oldlu.interpreter.demo.calculate;import java.util.Stack;
/*** @ClassName Calculator* @Description 计算器* @Author oldlu* @Version 1.0*/
public class Calculator {private Stack<IArithmeticInterpreter> stack = new Stack<>();public Calculator(String expression) {parse(expression);}private void parse(String expression) {//解析 10 + 20 表达式String[] eles = expression.split(" ");IArithmeticInterpreter left,right;for(int i= 0;i < eles.length;i++){String operator = eles[i];if(OperateUtil.ifOperator(operator)){left =this.stack.pop();right = new NumInterpreter(Integer.valueOf(eles[++i]));System.out.println("出栈:"+left.interpret()+"和"+right.interpret());this.stack.push(OperateUtil.getInterpreter(left,right,operator));System.out.println("应用运算符:"+operator);}else {NumInterpreter numInterpreter = new NumInterpreter(Integer.valueOf(eles[i]));this.stack.push(numInterpreter);System.out.println("入栈:"+numInterpreter.interpret());}}}public int calculate(){return this.stack.pop().interpret();}
}

2.解释器顶层接口

package com.oldlu.interpreter.demo.calculate;/*** @ClassName IArithmeticInterpreter* @Description 顶层解释器接口* @Author oldlu* @Version 1.0*/
public interface IArithmeticInterpreter {int interpret();
}

3.数值解释器实现

package com.oldlu.interpreter.demo.calculate;/*** @ClassName NumInterpreter* @Description 具体解释器实现类,终结表达式* @Author oldlu* @Date 2020/6/23 14:24* @Version 1.0*/
public class NumInterpreter implements IArithmeticInterpreter {private int value;public NumInterpreter(int value) {this.value = value;}@Overridepublic int interpret() {return this.value;}
}

4.两个操作数解释器抽象类

package com.oldlu.interpreter.demo.calculate;/*** @ClassName Interpreter* @Description 操作数解释器实现* @Author oldlu* @Version 1.0*/
public abstract class Interpreter implements IArithmeticInterpreter {protected IArithmeticInterpreter left;protected IArithmeticInterpreter right;public Interpreter(IArithmeticInterpreter left, IArithmeticInterpreter right) {this.left = left;this.right = right;}//这里是一个空方法,具体逻辑在子类实现@Overridepublic int interpret() {return 0;}
}

5.四则运算解释器实现

package com.oldlu.interpreter.demo.calculate;/*** @ClassName AddInterpreter* @Description +运算符解释器* @Author oldlu* @Version 1.0*/
public class AddInterpreter extends Interpreter{public AddInterpreter(IArithmeticInterpreter left, IArithmeticInterpreter right) {super(left, right);}@Overridepublic int interpret() {return this.left.interpret() + this.right.interpret();}
}
package com.oldlu.interpreter.demo.calculate;/*** @ClassName SubInterpreter* @Description 减法解释器* @Author oldlu* @Version 1.0*/
public class SubInterpreter extends Interpreter{public SubInterpreter(IArithmeticInterpreter left, IArithmeticInterpreter right) {super(left, right);}@Overridepublic int interpret() {return this.left.interpret() - this.right.interpret();}
}
package com.oldlu.interpreter.demo.calculate;/*** @ClassName MultiInterpreter* @Description 乘法解释器* @Author oldlu* @Version 1.0*/
public class MultiInterpreter extends Interpreter {public MultiInterpreter(IArithmeticInterpreter left, IArithmeticInterpreter right) {super(left, right);}@Overridepublic int interpret() {return this.left.interpret() * this.right.interpret();}
}
package com.oldlu.interpreter.demo.calculate;/*** @ClassName DivInterpreter* @Description 除法解释器* @Author oldlu* @Version 1.0*/
public class DivInterpreter extends Interpreter{public DivInterpreter(IArithmeticInterpreter left, IArithmeticInterpreter right) {super(left, right);}@Overridepublic int interpret() {return this.left.interpret() / this.right.interpret();}
}

6.操作符工具类

package com.oldlu.interpreter.demo.calculate;/*** @ClassName OperateUtil* @Description 运算符解析工具类* @Author oldlu* @Version 1.0*/
public class OperateUtil {public static boolean ifOperator(String symbol){return (symbol.equals("+") || symbol.equals("-") || symbol.equals("*") || symbol.equals("/"));}public static Interpreter getInterpreter(IArithmeticInterpreter left,IArithmeticInterpreter right,String symbol){if(symbol.equals("+")){return new AddInterpreter(left,right);}else if(symbol.equals("-")){return new SubInterpreter(left,right);}else if(symbol.equals("*")){return new MultiInterpreter(left,right);}else if(symbol.equals("/")){return new DivInterpreter(left,right);}return null;}
}

7.测试类

package com.oldlu.interpreter.demo.calculate;/*** @ClassName Test* @Description 测试类* @Author oldlu* @Version 1.0*/
public class Test {public static void main(String[] args) {System.out.println("result:"+new Calculator("10 + 30").calculate());System.out.println("---------------------------");System.out.println("result:"+new Calculator("10 * 30").calculate());System.out.println("---------------------------");System.out.println("result:"+new Calculator("10 - 30 + 11").calculate());System.out.println("---------------------------");System.out.println("result:"+new Calculator("10 / 30 + 10 * 4 - 15").calculate());}
}

测试结果:

img

其实,spring-expression模块中已经提供了四则运算的功能。

测试类如下:

package com.oldlu.interpreter.demo.calculate;import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;/*** @ClassName SpringTest* @Description spring表达式包测试* @Author oldlu* @Version 1.0*/
public class SpringTest {public static void main(String[] args) {ExpressionParser parser = new SpelExpressionParser();Expression expression = parser.parseExpression("10 / 30 + 10 * 4 - 15");Integer result = (Integer) expression.getValue();System.out.println("计算结果:"+result);//25}
}

注意:这个代码是有问题的?

后面会进行分析并解决。如:10 * 30 + 10 * 4 - 15,表达式存在优先级问题,默认按从左到右的顺序执行。

添加依赖:

 <dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>5.0.2.RELEASE</version></dependency>

2.3.3 解释器模式在源码中应用

jdk下Pattern类

从构造器出发:

private Pattern(String p, int f) {pattern = p;  //存储表达式flags = f;// to use UNICODE_CASE if UNICODE_CHARACTER_CLASS presentif ((flags & UNICODE_CHARACTER_CLASS) != 0)flags |= UNICODE_CASE;// Reset group index countcapturingGroupCount = 1;localCount = 0;if (pattern.length() > 0) {compile();  //进行编译} else {root = new Start(lastAccept);matchRoot = lastAccept;}}

2.4.4 spring中ExpressionParser

img

它是一个接口,下面查看实现类SpelExpressionParser:

protected SpelExpression doParseExpression(String expressionString, @Nullable ParserContext context) throws ParseException {return new InternalSpelExpressionParser(this.configuration).doParseExpression(expressionString, context);
}

2.5 解释器模式的使用总结

2.5.1 优缺点总结

优点:

1.扩展性强:在解释器模式中,由于语法是由很多类表示,当语法规则更改时,只需要修改相应的非终结符表达式即可。

若扩展语法时,只需添加相应的非终结符类即可。

2.增加了新的解释表达式的方式。

3.易于实现文法:解释器模式对应的文法应当比较简单易于实现的,过于复杂的语法不适合使用解释器模式。

缺点:

1.语法规则比较复杂时,会引起类大量增加。

2.执行效率比较低。

http://www.ritt.cn/news/8659.html

相关文章:

  • .net双拼做公司网站网络销售怎么才能找到客户
  • 免费咨询网站伟哥seo博客
  • 做宣传网站需要多少钱外包推广服务
  • 上饶做网站抖音优化排名
  • 3.0效果网站建设多少钱seo入门基础教程
  • 网站被攻击了怎么办快刷网站
  • 做神马网站优化排百度云网盘登录入口
  • 做网站群的公司企业微信scrm
  • 高端企业门户网站建设费用百度极速版下载
  • 京东做代码的网站吗连云港seo
  • 自己想注册公司怎么搞网络推广优化seo
  • 一站传媒seo优化网络营销策划方案怎么写
  • 网页浏览器哪个好seo网站优化方案案例
  • 机械网站源码 php国外免费建站网站
  • 济南网站建设 小程序宁德市教育局官网
  • wordpress能否做网站新品牌进入市场的推广方案
  • 上海做网站比较有名的公司有哪些百度网盘下载电脑版官方下载
  • 西安制作网站软件谷歌浏览器app下载安装
  • 交友网站有人做加拿大28互联网广告推广好做吗
  • 江苏网站seo优化企业查询官网入口
  • 专业的教育行业网站制作站长统计app软件
  • 招聘网站销售怎么做互联网营销推广
  • 企业网站 seo怎么做舆情分析系统
  • 支付网站认证费用怎么做分录网络营销的模式有哪些?
  • 自做网站视频灰色关键词排名代发
  • 网站建设业务的延伸性百度高级搜索网址
  • 网站首页的布局设计游戏推广员怎么做
  • 什么企业做网站比较方便呢百度云网站入口
  • 张家港建设银行网站爱站网 关键词挖掘工具
  • 郑州最新发布信息网站seo公司