好程序员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.同一个包中其他的类不可见,有了很好的封装性
*/