好程序员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.同一个包中其他的类不可见,有了很好的封装性
 */
相关文章
|
2月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
346 2
|
2月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
364 0
|
4月前
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
4月前
|
Java 关系型数据库 数据库
Java 项目实战教程从基础到进阶实战案例分析详解
本文介绍了多个Java项目实战案例,涵盖企业级管理系统、电商平台、在线书店及新手小项目,结合Spring Boot、Spring Cloud、MyBatis等主流技术,通过实际应用场景帮助开发者掌握Java项目开发的核心技能,适合从基础到进阶的学习与实践。
675 3
|
2月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
428 35
|
7月前
|
人工智能 Kubernetes Java
回归开源,两位 Java 和 Go 程序员分享的开源贡献指引
Higress是一个基于Istio和Envoy的云原生API网关,支持AI功能扩展。它通过Go/Rust/JS编写的Wasm插件提供可扩展架构,并包含Node和Java的console模块。Higress起源于阿里巴巴,解决了Tengine配置重载及gRPC/Dubbo负载均衡问题,现已成为阿里云API网关的基础。本文介绍Higress的基本架构、功能(如AI网关、API管理、Ingress流量网关等)、部署方式以及如何参与开源贡献。此外,还提供了有效的开源贡献指南和社区交流信息。
765 33
|
2月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
322 8
|
3月前
|
安全 Java
Java之泛型使用教程
Java之泛型使用教程
307 10
|
7月前
|
Java 程序员 应用服务中间件
【高薪程序员必看】万字长文拆解Java并发编程!(2 2-2)
📌 核心痛点暴击:1️⃣ 面了8家都被问synchronized锁升级?一张图看懂偏向锁→重量级锁全过程!2️⃣ 线程池参数不会配?高并发场景下这些参数调优救了项目组命!3️⃣ volatile双重检测单例模式到底安不安全?99%人踩过的内存可见性大坑!💡 独家亮点抢先看:✅ 图解JVM内存模型(JMM)三大特性,看完再也不怕指令重排序✅ 手撕ReentrantLock源码,AQS队列同步器实现原理大揭秘✅ 全网最细线程状态转换图(附6种状态转换触发条件表)
140 0
|
7月前
|
存储 缓存 Java
【高薪程序员必看】万字长文拆解Java并发编程!(5):深入理解JMM:Java内存模型的三大特性与volatile底层原理
JMM,Java Memory Model,Java内存模型,定义了主内存,工作内存,确保Java在不同平台上的正确运行主内存Main Memory:所有线程共享的内存区域,所有的变量都存储在主存中工作内存Working Memory:每个线程拥有自己的工作内存,用于保存变量的副本.线程执行过程中先将主内存中的变量读到工作内存中,对变量进行操作之后再将变量写入主内存,jvm概念说明主内存所有线程共享的内存区域,存储原始变量(堆内存中的对象实例和静态变量)工作内存。
254 0