23种设计模式-开篇-聚合&组合

本文作为23种设计模式的开篇,首先介绍了构造函数的作用,然后详细讲解了聚合和组合的区别,通过代码示例帮助理解。聚合强调外层创建并传入,而组合则是初始化时创建且不可再拆分。适配器、命令、迭代器和模板方法等模式都会用到这两种概念。
摘要由CSDN通过智能技术生成

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();
}

这里简单的举了四个模式的例子,基本所有的模式,都需要利用构造函数进行聚合或者组合,来实现设计。所以在设计原则、设计模式之前,我们打好基础,准备好深入的学习吧


总结

设计模式之本,组合与聚合,理解了本节,我们就可以坐稳发车喽!~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值