23种设计模式
文章目录
前言
这系列文章十分基础,只要面向刚刚从Java基础过度而来的朋友,可能你刚刚认识了Java代码,正好有机会看到此文章,希望对你们的设计模式之路会有更好的帮助。市面上一切面向不懂设计模式的人去谈源码的教学视频,都是耍流氓。底层基础成就上层艺术,当我们看到如艺术品一样的Spring框架,不免更应该回头先将自己的基础夯实。才有机会能读懂源码的那一天到来。本篇文章有钱入深,从设计模式结合源码与实战三位一体的分析方式进行讲解。
一、了解设计原则与模式之前
我们先来了解相比这些(设计原则&设计模式)更为重要的内容吧!
二、开篇(设计原则&23种设计模式之前)
1.构造函数 [Constructor]
构造函数的目的:初始化(在JVM中大多数情况是在堆中,创建对象的“初始化”时进行)
在Java的虚拟机,如果我们不去主动创建构造函数,JVM会默认的帮我们创建一个无参无内容的构造函数,也就是什么都不去初始化,搞清这件事,我们继续向下看!
2.聚合& 组合
接着我们先来了解一下这2个概念(在了解设计原则&23种设计模式之前)
先来看一下下面的代码
代码片段1:
public ClassRoom{
public Student student;
public ClassRoom(Student student){
this.student = student;
}
}
代码片段2:
public Student{
public Head head;
public Student(){
head = new Head();
}
}
根据上面2段代码,您是否能区分区哪个是聚合、哪个是组合吗?
很明显可以看到:
1、第一段代码的构造方法需要传参
2、第二段代码的构造方法没有传参
2.1 聚合[ aggregation]
总结:外层创建,构造传入
public ClassRoom{
public Student student;
public ClassRoom(Student student){
this.student = student;
}
}
聚合就像一个班级有许多学生构成,学生离开了班级,作为一个个体仍然能够存活。
这个比喻不管恰不恰当,我们可以换个角度理解,学生不是最小“单位”的。而且我们需要从外层创建好组装好,再放到这个班级里。
2.2 组合[composition]
总结:初始化创建,不可再拆分
public Student{
public Head head;
public Student(){
head = new Head();
}
}
组合的关系就像一个学生和他的各个器官,手、脚、鼻子、眼睛等器官组合成了一个学生, 这些器官离开了学生这个个体,也就失去了意义,无法单独生存。
组合关系的类具有相同的生命周期,它们的联系更加紧密。
3.在其他模式中的使用
3.1 适配器模式
代码如下(示例):
// 适配器模式: 将 鸭子 ----> 转为 ----> 野鸡 的适配器
ublic class DuckAdapter implements Turkey {
Duck duck;
//
public DuckAdapter(Duck duck) {
this.duck = duck;
}
...
}
3.2 命令模式
// 命令模式:开关灯命令
public class LightOnCommond implements Command {
Light light;
public LightOnCommond(Light light) {
this.light = light;
}
@Override
public void execute() {
light.on();
}
}
3.3 迭代器模式
// 迭代器模式
public class DinerMenuIterator implements Iterator {
MenuItem[] menuItems;
int position = 0;
public DinerMenuIterator(MenuItem[] menuItems) {
this.menuItems = menuItems;
}
public boolean hasNext() {
if (position >= menuItems.length || menuItems[position] == null) {
return false;
} else {
return true;
}
}
public Object next() {
MenuItem menuItem = menuItems[position];
position = position + 1;
return menuItem;
}
}
3.4 模板方法模式
public abstract class Animal {
// 使用 final 防止被子类重写
public final void behavior() {
breath();
eat();
sleep();
move();
}
public void breath() {
System.out.println("breath");
}
public void sleep() {
System.out.println("sleep");
}
// 需要子类实现的方法
public abstract void eat();
// 需要子类实现的方法
public abstract void move();
}
这里简单的举了四个模式的例子,基本所有的模式,都需要利用构造函数进行聚合或者组合,来实现设计。所以在设计原则、设计模式之前,我们打好基础,准备好深入的学习吧
总结
设计模式之本,组合与聚合,理解了本节,我们就可以坐稳发车喽!~