好程序员Java教程分享Java之设计模式

好程序员Java实用教程之设计模式,首先来讲一下单例设计模式

单例设计模式

/*
 * 设计模式:前人总结出来的对一些常见问题的解决方案,后人直接拿来使用.
 * 常用的设计模式:单例,工厂,代理,适配器,装饰,模板,观察者等,一共有23种
 * 单例:一个类只允许有一个对象,建立一个全局的访问点,提供出去供大家使用.
 *
  * 分析:
 * 1.我们肯定要建立一个单例类来描述
 * 2.只允许有一个对象
 * 3.全局的访问点:说的就是当前的s----通过static实现的
 * 4.提供出去
 * 5.给大家使用
 *
 * 分类:
 * 饿汉式:在定义当前单例类对象成员变量时直接初始化.
 * 懒汉式:什么时候用什么时候赋值(在公共方法中进行赋值)
 *
 * 作用:
 * 1.传值
 * 2.作为全局的访问点.
 *
 *使用单例传值的好处:
 * * 好处:可以让两个对象在完全没有关系的前提下,实现值的传递,降低了耦合性,提高了内聚性
 *
 * 耦合性,内聚性在微观上说:描述的是类与类之间的关系
 * 好处:我们应该尽量提高内聚性,减少耦合性,可以提高程序的健壮性,增加代码的可移植性,方便实现模块儿化编程
 *
 * 如何做到低耦合高内聚?
 * 在处理类与类关系的时候,让类之间的关系越紧密耦合性越高,内聚性越低.反之,关系越松散耦合性越低,内聚性越高.
 */

工厂设计模式

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

Lambda表达式

Lambda表达式是Java8之后的新特性
Lambda表达式是函数式编程
Java-->面向对象语言 block代码块(闭包) 函数式编程(接近于面向过程) --> 面向对象
什么是函数式编程?函数式编程(英语:functional programming)或称函数程序设计,
又称泛函编程,是一种编程范型,它将电脑运算视为数学上的函数(cos sin tan)计算,
并且避免使用程序状态以及易变对象。函数编程语言最重要的基础是λ演算(lambda calculus)。
而且λ演算的函数可以接受函数当作输入(引数)和输出(传出值)。
ps:λ这个符号可以在搜狗输入法的符号中显示

而在面向对象编程中,面向对象程序设计(英语:Object-oriented programming,缩写:OOP)
是种具有对象概念的程序编程范型,同时也是一种程序开发的方法。它可能包含数据、属性、代码与方法。
对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、
灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,
计算机程序会被设计成彼此相关的对象。

Lambda表达式能干什么

将接口的实现方式重匿名内部类的形式简化为了一个函数式表达式方式
简化接口实现

语法:

(形参参数) -> 表达式 或{方法体};
ps:
Lambds表达式就是实现了当前接口中的方法及简
void show();
() -> {System.out.println("我是Lambda表达式")};

1.形参列表
形参列表允许省略参数类型,若形参列表中只有一个参数,形参列表的原括号也可以省略
ps:形参列表 对应的是 接口中所需要实现方法的 形参列表
void show(int a, int b);
void display(int c);
(int a,int b) -> {实现};
(int a) -> {实现};
a -> {实现};

2.箭头(->)
必须是英文状态下的符号 减号(-) + 大于号(>) 指向实现代码块

3.代码块:
若代码块只包含一条语句,Lambda表达式允许允许省略花括号
若Lambda表达式中只有一条return,可以省略return关键字
若Lambda表达式中有多条语句(实现方法的逻辑)不能省略大括号

ps:Java中Lambda表达式的结合需要和接口完成
? Stream API --> 流式编程
看Lambda包Test类
Lambda表达式还能作为参数传递
看Lambda包TestDemo类

ps:Java8中若这个接口需要使Lambda表达式实现此时我们需要在这个接口上提供一个注解
@FunctionalInteFace

Lambda表达式引用全局变量和局部变量
看Lambda包TestDemo2类

Lambda式表达式引用构造方法和方法引用

1.引用类方法
在函数式接口中定义的抽象方法,而方法的实现是触发某个类方法实现此时我们就可以通过 :: 形式完成
看Lambda包TestDemo3

2.引用实例方法(成员方法)
在函数式接口中定义的抽象方法,而方法的实现是通过触发某类类创建的来完成时我们就可以 通过 :: 形式完成
看Lambda包TestDemo4;
版本二:
在函数式接口中定义的抽象方法,而方法上的实现是通过抽象方法中特定的对象参数来完成我们可以通过 :: 形式完成
不过 :: 之前是当前对象的数据了类型,而非 new出一个对象
看Lambda包TestDemo5;
3.引用构造方法
在函数式接口中定义的抽闲方法,而该方法的实现是通通过new 来创建对象,此时我们就可以使用 :: 形式来完成
ps:固定形式 构建对象的类型 :: new;
看Lambda包TestDemo6;

总结:

在上面两个案例中使用到了一个全新的形式 类或(对象) :: 静态方法/成员方法
若在Lambda表达式中引用了静态方法或成员方法时 只有一句话 ,可以使用 :: 形式进行简化
:: 之前 是这个方法主要的调用发起者 类/对象
:: 之后 静态方法/成员方法
ps:一定要主要 方法后面千万不要传入参数
? 调用方法的参数,会通过接口中方法的参数进行传递
?
Lambda表达式和匿名内部类的区别
1.匿名内部类可以为任意接口创建对象,不管接口中包含多少个抽象方法,只要匿名内部类实现所有方法即可
? 但是Lambda表达式只能为函数式接口创建对象(只能实现一个抽象方法)
2.匿名内部类可以为抽象类甚至是普通类创建对象
? 但是Lambda表达式只能为函数接口创建对象
3.匿名内内部类实现的抽象方法方法体允许调用接口定义默认(default)方法
? 但是Lambda表达式的实现是不允许调用默认方法的
?
Lambda的实际引用
看Lambda包TestDemo7;

ps:
1.需要记住形式为了Scala做准备
2.Lambda可以替换匿名内部类一次实现的方式
Lambda只能实现接口中一个抽方法.

模板设计模式

/*
 * 模板设计模式:我们在实现一个功能的时候,功能分成两部分,一部分是确定的,一部分是不确定的.将确定的部分交给当前类实现
 *              将不确定的部分交给子类实现.子类实现的结果又会反过来影响确定部分的功能.
 *
 * 实例:计算一个功能的耗时
 * 分析:固定的功能:开始时间,结束时间
 * 不固定的功能:程序运行的时间
 */

内部类

/*
 * 内部类:定义在A类里面的B类就是内部类,内部类的地位与A类的成员变量,成员方法平等,内部类也可以看做是A类的成员,成员之间可以相互调用
 作用:我们可以通过内部类让java间接实现多继承
 */

 /*
 * 局部内部类:定义在一个类方法中的类
 * 作用范围:从定义开始到当前的方法结束
 */

 /*
 * 静态内部类:内部类的类型是static类型的.
 注意:静态内部类不一定有静态方法,有静态方法的一定是静态内部类
 */

 /*
 * 匿名内部类(对象):定义在一个类方法中的匿名子类对象,属于局部内部类
 * 匿名子类对象:
 * 匿名内部类对象:
 *
 * 创建匿名内部类对象注意点:1.匿名内部类对象必须有父类或者父接口
 *
     匿名内部类对象的作用:
 * 1.当只用到当前子类的一个实例对象的时候,定义好马上使用
 * 2.当不好起名字的时候
 * 3.可以更好的定义运行时的回调(知道即可)
 *
 * 内部类的作用:
 * 1.间接实现了多继承
 * 2.方便定义
 * 3.只有外部类可以访问创建的内部类的属性和方法,包括私有方法
 * 4.同一个包中其他的类不可见,有了很好的封装性
 */

原文地址:https://blog.51cto.com/14573321/2458031

时间: 2024-09-29 00:34:16

好程序员Java教程分享Java之设计模式的相关文章

好程序员Python教程分享python之变量

好程序员Python教程分享python之变量,变量(variable)是必经之路,它是学习python初始时,就会接触到的一个新的知识点,也是一个需要熟知的概念.python是一种动态类型语言,在赋值的执行中可以绑定不同类型的值,这个过程叫做变量赋值操作,赋值同时确定了变量类型. 什么是变量 在玩蛇网python学习过程中会用到许多数据,那为了方便操作,需要把这些数据分别用一个简单的名字代表,方便在接下来的程序中引用.变量就是代表某个数据(值)的名称. python变量赋值如何定义操作 变量定

好程序员Java教程分享Java中String类型的10个问题

如何比较两个字符串?用"="还是equals简单来说,"=="是用来检测俩引用是不是指向内存中的同一个对象,而equals()方法则检测的是两个对象的值是否相等.只要你想检测俩字符串是不是相等的,你就必须得用equals()方法. 如果你知道"字符串保留(string intern)"的概念那就更好了. 为什么安全敏感的字符串信息用char[]会比String对象更好?String对象是不可变的就意味着直到垃圾回收器过来清扫之前它们都不会发生变化

好程序员Java教程分享MyBatis Plus介绍

好程序员Java教程分享MyBatis Plus介绍:1.MyBatis Plus 介绍 MyBatis Plus 是国内人员开发的 MyBatis 增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生. MyBatis Plus 的核心功能有:支持通用的 CRUD.代码生成器与条件构造器. 通用 CRUD:定义好 Mapper 接口后,只需要继承 BaseMapper<T> 接口即可获得通用的增删改查功能,无需编写任何接口方法与配置文件 条件构造器:通过 Enti

好程序员Java教程分享Javamain常见面试问题

好程序员Java教程分享Javamain常见面试问题,Java程序员在参加面试的时候,在Javamain方面都会被问到哪些问题呢?为大家准备一些常见的Javamain的基础知识问题,帮助大家在面试前做好准备: 1.不用main方法如何定义一个类? 不行,没有main方法我们不能运行Java类. 在Java7之前,你可以通过使用静态初始化运行Java类.但是,从Java7开始就行不通了. 2.main()方法需要的参数不是字符串数组? 不是的,main()方法的参数必须是字符串数组. 但是,在引进

Java程序员进阶路线-高级java程序员养成

1. 引言 搞Java的弟兄们肯定都想要达到更高的境界,用更少的代码解决更多的问题,用更清晰的结构为可能的传承和维护做准备.想想当初自己摸着石头过河,也看过不少人介绍的学习路线,十多年走过来多少还是有些收获.现通过自身经历总结一篇文章,供弟兄们参考. 2.  用好正在用的框架 在已经加入的团队中,和大家协作使用团队已选好的框架.不管框架优劣与否,特点如何,选择了它必然有一定的道理.并且能够在业界经久流行的框架也一定有它的优秀之处. 使用框架第一步是熟悉,可能通过复制和修改前人的代码来实现新的功能

黑马程序员____第一阶段Java开发前奏(1)

  黑马程序员____第一阶段Java开发前奏(1) ⒈软件开发:        软件是由一系列按照特定顺序组织的计算机数据和指令的集合,软件开发就是制作软件.软件的出现实现了人与计算机之间的交互.    ⒉人机交互方式:        图形化界面和命令行方式,图形化界面简单直观,使用者易于接受,容易上手操作.命令行方式需要有一个控制台,输入特定的指          令,让计算机完成一些操作,较为麻烦,需要记住一些命令.    3.常用的DOS命令:     dir:列出当前目录下的文件以及文

写给在迷茫期的程序员(尤其是Java程序员)入行了一年,感觉不知道接下来该怎么做才能继续进步了,求指教

入行了一年,感觉不知道接下来该怎么做才能继续进步了,求指教(V2EX) @kafka0102 :做技术可以学的东西太多了,只是在不同的阶段做好不同的规划,要结合当前所做的事情去做更深入或广度的学习.以Java Web开发为例,至少可以拓展的点有: 1.Web框架的原理学习,比如Spring.Play等等,最好自己能写出个简易的MVC框架(几千行代码).这样至少对常用设计模式.反射等技术很熟练了. 2.优秀代码研读.比如Java集合类.JUnit.Spring等源码,写出源码分析,会有很多收获.源

好程序员前端教程-javascript的面向对象

好程序员前端教程-javascript的面向对象一.什么是面向对象?1.面向对象就是把构成问题是无分解成多个对象,建立对象不是为了完成某个步骤,而是描述某个事物在这个解决问题的步骤中的行为.2.面向对象是一种思维方法.3·面向对象是一种编程方法.4·面向对象并不只针对某一种编程语言.二.面向对象和面向过程的区别和联系?1.面向过程侧重整个问题的解决步骤,着眼局部或者具体.2·面向对象侧重具体的功能,让某个对象具有这样的功能,更侧重整体.面向过程的优点:1.流程化使得编程任务明确,在开发之前基本考

好程序员大数据分享:Hbase精解

好程序员大数据分享:Hbase精解,为什么有hbase?hbase是什么?Hbase的架构. 一. 为什么有hbase? 数据量越来越大,传统的关系型数据库不能满足存储和查询的需求.而hive虽然能满足存储的要求,但是hive不能满足非结构化.半结构化数据的存储和查询. 二.hbase是什么? hbase是一个开源的.分布式的.多版本的.可扩展的非关系型数据库.hbase是bigtable的开源java版本,建立在hdfs之上,提供高可靠性的.高性能.列式存储.可伸缩.实时读写的nosql数据库