Jay's Blog

知而不行为不知


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 留言

  • 搜索

设计模式之观察者模式

发表于 2018-08-01 | 分类于 Java | 阅读次数:
字数统计: 193 字 | 阅读时长 ≈ 1 分钟

定义

在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。
其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。
Subject-Observer,更新方法建议为update。
触发通知的时机是发布者状态改变后。

实现的两种方式

  1. 推模型
    将所有信息传递给观察者
  2. 拉模型
    将观察者对象传过去,需要什么信息,观察者自己读

利用java实现观察者模式

  1. java.util.observable
  2. 接口Oberserver,update方法

何时使用

触发联动:观察者模式的本质

设计模式之策略模式

发表于 2018-08-01 | 分类于 Java | 阅读次数:
字数统计: 208 字 | 阅读时长 ≈ 1 分钟

定义

策略模式将可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现并使它们可以相互替换,从而导致客户端程序独立于算法的改变。

开发推荐的方式

复合优先于继承
多用组合,少用继承

设计原则:

面向接口编程;
将共同的;
多用组合,少用继承。

实现:

  1. 通过分离变化得出的策略接口Strategy;
  2. Strategy的实现类;
  3. 客户程序(抽象)中有一个Strategy;
  4. 在客户程序(实现)中选择、组装正确的strategy实现

适用场景

  1. 许多相关的类仅仅是行为差异
  2. 运行时选取不同的算法变体
  3. 通过条件语句在多个分支中选取

java中的comparator

‘设计模式之适配器模式

发表于 2018-08-01 | 分类于 Java | 阅读次数:
字数统计: 51 字 | 阅读时长 ≈ 1 分钟

定义: 为解决不兼容而引入的

适配器分类:

  1. 组合
  2. 继承(由于java的单继承,重用性比较低)

作用:
透明;重用;低耦合

https://www.cnblogs.com/V1haoge/p/6479118.html

设计模式之工厂模式

发表于 2018-08-01 | 分类于 Java | 阅读次数:
字数统计: 728 字 | 阅读时长 ≈ 2 分钟

概念:

实例化对象,用工厂方法代替new操作;
包括工厂方法模式和抽象工厂模式;
抽象工厂模式是工厂方法模式的扩展。

意图:

定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化;
工厂方法把实例化的工作推迟到子类中去实现。

应用场景:

有一组类似的对象需要创建;
扩展性

常见应用:

  1. JDBC:
  2. spring beanfactory:作为spring基础的IoC容器,是spring的一个bean工厂。
  3. 解析xml

工厂模式用来创建一个产品的等级结构,而抽象工厂模式用来创建多个产品的等级结构;
工厂模式只有一个抽象产品类,而抽象工厂模式有多个抽象产品类。

工厂方法模式和抽象工厂模式区别

工厂模式在一些设计模式的书中分为简单工厂模式,工厂方法模式和抽象工厂模式三类。
也有把工厂方法模式划分到抽象工厂模式的,认为工厂方法是抽象工厂模式的特例的一种,就是只有一个要实现的产品接口。

简单工厂:工厂类中,根据条件决定一个接口由哪个具体产品类来实现。

工厂方法:创建多个工厂类。各个工厂类中,都对应一个获得接口A实例的方法。用户决定使用哪个工厂。

抽象工厂:对工厂方法进行扩展。各个工厂类中,再增加一个获得接口B实例的方法。

提一下,多个工厂类都继承自同一个接口。

   个人觉得这个区别在于产品,如果产品单一,最合适用工厂模式,但是如果有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。再通俗深化理解下:工厂模式针对的是一个产品等级结构 ,抽象工厂模式针对的是面向多个产品等级结构的。

再来看看工厂方法模式与抽象工厂模式对比:

工厂方法模式 抽象工厂模式
针对的是一个产品等级结构 针对的是面向多个产品等级结构
一个抽象产品类 多个抽象产品类
可以派生出多个具体产品类 每个抽象产品类可以派生出多个具体产品类
一个抽象工厂类,可以派生出多个具体工厂类 一个抽象工厂类,可以派生出多个具体工厂类
每个具体工厂类只能创建一个具体产品类的实例 每个具体工厂类可以创建多个具体产品类的实例

设计模式之代理模式

发表于 2018-08-01 | 分类于 Java | 阅读次数:
字数统计: 732 字 | 阅读时长 ≈ 2 分钟

定义: 为其他对象提供一种代理以控制对这个对象的访问;

静态代理实现:

  1. 继承实现;
  2. 聚合实现(更灵活);

动态代理(如何体现动态,就是当接口中又添加新功能时,代理中不用改变):

  1. 实现步骤:

    使用被代理对象创建InvocationHandler对象实例
    生成代理对象实例
    生成proxy代理对象的字节码文件,并创建proxy的类对象
    根据proxy的类对象使用反射创建proxy对象实例
    在代理对象实例上调用目标方法(就是调用invoke的过程)

JAVA动态代理用法与实现过程

  1. jdk动态代理(基于接口代理)与cglib动态代理(基于继承代理)

上面是一个很简单的例子,可以看出,我们想对外开放某些功能,就可以将这些功能在代理类中被引用,
如此一来,屏蔽了我们不想外露的功能,只将我们想开放的功能开放出来。亦即委托类中其实是可以有很多方法的,
很多功能的,我们可以酌情对外开放,代理类犹如一道大门,将委托类与外部调用者隔绝开来,只将部分功能赋予这个大门,
来代替委托类行使这个功能,哪怕最终还是要牵扯到自身(因为最终还是要调用委托类的对应方法实现)。

代理模式很简单,只要记住以下关键点,简单易实现:

    (1)代理类与委托类实现同一接口

    (2)在委托类中实现功能,在代理类的方法中中引用委托类的同名方法

    (3)外部类调用委托类某个方法时,直接以接口指向代理类的实例,这正是代理的意义所在:屏蔽。

  代理模式场景描述:

    (1)当我们想要隐藏某个类时,可以为其提供代理类

    (2)当一个类需要对不同的调用者提供不同的调用权限时,可以使用代理类来实现(代理类不一定只有一个,我们可以建立多个代理类来实现,也可以在一个代理类中金进行权限判断来进行不同权限的功能调用)

    (3)当我们要扩展某个类的某个功能时,可以使用代理模式,在代理类中进行简单扩展(只针对简单扩展,可在引用委托类的语句之前与之后进行)

  代理模式虽然实现了调用者与委托类之间的强耦合,但是却增加了代理类与委托类之间的强耦合(在代理类中显式调用委托类的方法),而且增加代理类之后明显会增加处理时间,拖慢处理时间。

设计模式之单例模式

发表于 2018-08-01 | 分类于 Java | 阅读次数:
字数统计: 209 字 | 阅读时长 ≈ 1 分钟

应用场合:有些对象只需要一个就足够了;
作用:保证某个实例只有一个
类型:懒汉模式和饿汉模式;

饿汉模式(加载的时候就已经创建实例了,加载类时比较慢,但运行时获取对象的速度比较快,线程安全):
步骤:

  1. 将构造方法私有化,不允许外部直接创建对象;
  2. 创建类的唯一实例(私有静态);
  3. 提供一个获得实例的静态方法获得2;(public static)

懒汉模式(当使用的时候才会创建,加载类时比较慢,但运行时获取对象的速度比较快,线程不安全):
步骤:

  1. 将构造方式私有化;
  2. 声明类的唯一实例,并没有创建;
  3. 会判断一下

单例模式七种写法

Java反射

发表于 2018-07-30 | 分类于 Java | 阅读次数:
字数统计: 188 字 | 阅读时长 ≈ 1 分钟

Java反射机制是构建框架技术的基础所在。
Java反射机制是指在运行状态中,动态获取信息以及动态调用对象方法的功能。

动态性质:

  1. 运行时生成对象实例;
  2. 运行期间调用方法;
  3. 运行时更改属性。

使用Java反射技术常用的类如下:
Class类等等

注意:
使用反射虽然会提高代码的灵活性,但通过反射创建对象时性能要稍微低一些。只有当程序需要动态创建某个累的对象时才会考虑使用反射。
在很多java框架中需要根据配置文件信息来创建Java对象。

jdbc中用class.forname来加载驱动程序

jdk各个版本比较

发表于 2018-07-26 | 分类于 学习笔记 | 阅读次数:
字数统计: 1.6k 字 | 阅读时长 ≈ 5 分钟

JDK5

  1. 自动装箱与拆箱:
  2. 枚举
  3. 静态导入,如:import staticjava.lang.System.out
  4. 可变参数(Varargs)
  5. 内省(Introspector),主要用于操作JavaBean中的属性,通过getXxx/setXxx。一般的做法是通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后我们就可以通过反射机制来调用这些方法。
  6. 泛型(Generic)(包括通配类型/边界类型等)
  7. For-Each循环
  8. 注解
  9. 协变返回类型:实际返回类型可以是要求的返回类型的一个子类型
  10. jdk5.0一很重要的特性就是增加了并发包java.util.concurrent.*

JDK6

  1. AWT新增加了两个类:Desktop和SystemTray,其中前者用来通过系统默认程序来执行一个操作,如使用默认浏览器浏览指定的URL,用默认邮件客户端给指定的邮箱发邮件,用默认应用程序打开或编辑文件(比如,用记事本打开以txt为后缀名的文件),用系统默认的打印机打印文档等。后者可以用来在系统托盘区创建一个托盘程序。(开发中基本没用过)
  2. 使用JAXB2来实现对象与XML之间的映射,可以将一个Java对象转变成为XML格式,反之亦然
  3. StAX,一种利用拉模式解析(pull-parsing)XML文档的API。类似于SAX,也基于事件驱动模型。之所以将StAX加入到JAXP家族,是因为JDK6中的JAXB2和JAX-WS 2.0中都会用StAX。
  4. 使用Compiler API,动态编译Java源文件,如JSP编译引擎就是动态的,所以修改后无需重启服务器。(刚知道是从这里开始可以动态编译的)
  5. 轻量级Http Server API,据此可以构建自己的嵌入式HttpServer,它支持Http和Https协议。
  6. 插入式注解处理API(PluggableAnnotation Processing API)
  7. 提供了Console类用以开发控制台程序,位于java.io包中。据此可方便与Windows下的cmd或Linux下的Terminal等交互。
  8. 对脚本语言的支持如: ruby,groovy, javascript
  9. Common Annotations,原是J2EE 5.0规范的一部分,现在把它的一部分放到了J2SE 6.0中
  10. 嵌入式数据库 Derby(这个也是刚知道,基本没用过)

JDK7

  1. 在Switch中可用String
  2. 添加了新特性:try-with-resources语句。所有需要关闭的资源只要实现了java.lang.AutoCloseable(java.io.Closeable就实现了这个接口)接口就在会程序结束后自动关闭。
  3. 数值可加下划线用作分隔符(编译时自动被忽略)
  4. 支持二进制数字,如:int binary= 0b1001_1001;
  5. 简化了可变参数方法的调用
  6. 调用泛型类的构造方法时,可以省去泛型参数,编译器会自动判断。
  7. Boolean类型反转,空指针安全,参与位运算
  8. char类型的equals方法: booleanCharacter.equalsIgnoreCase(char ch1, char ch2)
  9. 安全的加减乘除: Math.safeToInt(longv); Math.safeNegate(int v); Math.safeSubtract(long v1, int v2);Math.safeMultiply(int v1, int v2)……
  10. Map集合支持并发请求,注HashTable是线程安全的,Map是非线程安全的。但此处更新使得其也支持并发。另外,Map对象可这样定义:Map map = {name:”xxx”,age:18};

JDK8

  1. 接口的默认方法:即接口中可以声明一个非抽象的方法做为默认的实现,但只能声明一个,且在方法的返回类型前要加上“default”关键字。
  2. Lambda 表达式:是对匿名比较器的简化,如:
    Collections.sort(names,(String a, String b) -> { returnb.compareTo(a);});

对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字。如:
Collections.sort(names,(String a, String b) -> b.compareTo(a));
或:
Collections.sort(names, (a, b) -> b.compareTo(a));

  1. 函数式接口:是指仅仅只包含一个抽象方法的接口,要加@FunctionalInterface注解
  2. 使用 :: 关键字来传递方法或者构造函数引用
  3. 多重注解
  4. 还增加了很多与函数式接口类似的接口以及与Map相关的API等……
    参考博客
  5. hashmap冲撞
  6. 接口可以拥有方法体
  7. hashmap和concurrentHashMap改变

JDK9

  1. Java平台模块化系统:引入了一种新的Java编程组件模块,它是一个命名的、自描述的代码和数据集合。
  2. JLink
    当你使用具有显式依赖关系的模块和模块化的 JDK 时,新的可能性出现了。你的应用程序模块现在将声明其对其他应用程序模块的依赖以及对其所使用的 JDK 模块的依赖。为什么不使用这些信息创建一个最小的运行时环境,其中只包含运行应用程序所需的那些模块呢? 这可以通过 Java 9 中的新的 jlink 工具实现。你可以创建针对应用程序进行优化的最小运行时映像而不需要使用完全加载 JDK 安装版本。
  3. JShell : 交互式 Java REPL
    许多语言已经具有交互式编程环境,Java 现在加入了这个俱乐部。您可以从控制台启动 jshell ,并直接启动输入和执行 Java 代码。 jshell 的即时反馈使它成为探索 API 和尝试语言特性的好工具。
  4. 便利的工厂方法对于Collections:用少量的元素创建集合和映射的实例更容易。在列表、设置和映射接口上的新静态工厂方法使创建这些集合的不可变实例变得更加简单 例子:Set alphabet = Set.of(“a”, “b”, “c”);

JDK10

  1. 局部变量类型推断(最重要)
    局部变量类型推断可以说是Java 10中最值得注意的特性,这是Java语言开发人员为了简化Java应用程序的编写而采取的又一步.
    请注意,var 的作用仅仅是推断变量类型,变量仍然是静态类型的,与 JS 中的 var 作用完全不同。下面这段代码无法通过编译:
  2. GC改进和其他内务管理
  3. 线程本地握手(JEP 312)
    JDK 10将引入一种在线程上执行回调的新方法,因此这将会很方便能停止单个线程而不是停止全部线程或者一个都不停。

JDK4

NIO

有道云笔记汇总

发表于 2018-07-26 | 分类于 学习笔记 | 阅读次数:
字数统计: 155 字 | 阅读时长 ≈ 1 分钟

算法

机器学习与深度学习

  1. 网易云课堂Andrew机器学习
  2. 神经网络、keras、scikilearn、lstm
  3. 机器学习中的基本概念
  4. 深度学习
  5. 数据处理 http://note.youdao.com/noteshare?id=2393e605517823a3f5ed33e015360eb3 http://note.youdao.com/noteshare?id=f60fbbf7a3bd0e7646534aa4683f9da2

排序算法

  1. 快排
  2. 七种排序算法的直观理解

基本算法思想

  1. 马尔科夫过程
  2. 五大常用算法
  3. 动态规划
  4. 背包问题
  5. 优化算法

java

  1. javaweb

python

  1. python

数据结构与数据类型

  1. java和Python中的数据类型

读书摘要

  1. 改变未来的九大算法
  2. 全栈数据工程师养成攻略

其他

  1. Hadoop
    hive

简历之软件开发工程师(Java)

发表于 2018-07-19 | 分类于 简历 | 阅读次数:
字数统计: 848 字 | 阅读时长 ≈ 2 分钟

岗位描述:

  • 京东

    1-2019年毕业,计算机软件、数学、物理等相关专业本科及以上学历
    2-具有非常强的责任心,能够承担压力做事细心,参与独立系统的设计、开发、维护工作
    3-了解web前端开发的基础知识,会面向对象程序设计(OOP)与基本的设计模式,了解linux及基本的操作命令
    4-具有良好的算法基础及系统分析能力
    5-认真细致,踏实勤奋,具有较好的团队协作精神和沟通能力

  • 阿里巴巴

    如果你想了解JAVA开发在阿里巴巴互联网生态系统中无与伦比的应用广度与深度;
    如果你对基础技术感兴趣,你可以参与基础软件的设计、开发和维护,如分布式文件系统、缓存系统、Key/Value存储系统、数据库、Linux操作系统和Java优化等;
    如果你热衷于高性能分布式技术,你可以参与高性能分布式服务端程序的系统设计,为阿里巴巴的产品提供强有力的后台支持,在海量的网络访问和数据处理中,设计并设施最强大的解决方案;
    如果你喜欢研究搜索技术,你可以参与搜索引擎各个功能模块的设计和实现,构建高可靠性、高可用性、高可扩展性的体系结构,满足日趋复杂的业务需求;
    如果你对电子商务产品技术感兴趣,你可以参与产品的开发和维护,完成从需求到设计、开发和上线等整个项目周期内的工作;
    如果你对数据敏感,你可以参与海量数据处理和开发,通过sql、pl/sql、java进行etl程序开发,满足商业上对数据的开发需求;
    如果你热衷于客户端开发,你可以参与为用户提供丰富而有价值的桌面或无线软件产品。

岗位要求

  • 阿里巴巴

    或许,你来自计算机专业,机械专业,甚至可能是学生物的;
    但是,你酷爱着计算机以及互联网技术,热衷于解决挑战性的问题,追求极致的用户体验;
    或许,你痴迷于数据结构和算法,热衷于ACM,常常为看到“accept”而兴奋的手足舞蹈;
    或许,你熟悉Unix/Linux/Win32环境下编程,并有相关开发经验,熟练使用调试工具,并熟悉Perl,Python,shell等脚本语言;
    或许,你熟悉网络编程和多线程编程,对TCP/IP,HTTP等网络协议有很深的理解,并了解XML和HTML语言;
    或许,你热衷于数据库技术,能够熟练编写SQL脚本,有MySql或Oracle应用开发经验;
    或许,你并不熟悉Java编程语言,更精通C,C++,PHP,.NET等编程语言中的一种或几种,但你有良好和快速的学习能力;
    有可能,你参加过大学生数学建模竞赛,“挑战杯”,机器人足球比赛等;
    也有可能,你在学校的时候作为骨干参与学生网站的建设和开发;
    这些,都是我们想要的。来吧,加入我们!

<i class="fa fa-angle-left"></i>1…232425…27<i class="fa fa-angle-right"></i>

264 日志
34 分类
38 标签
GitHub Zhihu Wechat
© 2024 史海杰 | Site words total count: 722k
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4