设计模式概述(复习)--持续更新

Android知识点复习(持续更新中) 外链图片转存中…(img-gIiiAmp2-1710570490171)][外链图片转存中…(img-64eMeMVj-1710570490171)][外链图片转存中…(img-ijdoPJDM-1710570490172)][外链图片转存中…(img-i5NrhBc0-1710570490172)] 阅读详情

1 设计模式七大原则

1.1 单一职责原则

1.1.1 含义

  • 降低类的复杂度,一个类只负责一项职责
  • 降低代码更改的影响
  • 提供可读性、可维护性
  • 通常都需要遵守单一职责原则,逻辑足够简单才可以违反;只有类中方法比较少,可以在方法级别遵守单一职责原则

1.2 开闭原则

  • 对提供方开放扩展,对使用方关闭修改
  • 尽量通过扩展而不是修改实现功能
  • 使用设计模式的目的就是遵守开闭原则

1.3 迪米特原则

  • 最小知道法则
  • 方法入参、方法返回值和成员变量成为直接朋友,而局部变量称为间接朋友
  • 被依赖的类不管逻辑多复杂,都尽量封装到类的内部
  • 迪米特法则的核心是:降低类与类之间的耦合,并不是完全没有依赖

1.4 接口隔离原则

  • 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上.
  • 示例:如果C依赖1~3方法,而A依赖1、4、5方法,那么依赖关系应该从图1改为图2
    AC都依赖接口1
    在这里插入图片描述

1.5 依赖转置原则

1.5.2 特征

  • 高层模块不应该依赖底层模块
  • 抽象不应该依赖细节
  • 中心思想是:面向接口编程
  • 理念:抽象的东西相对于细节更稳定
  • 接口和抽象类主要是用来搭建规范,细节有具体的实现类来实现

1.5.2 依赖传递的方式

  • 接口方式
  • 构造器方式
  • setter方式

1.5.3 注意事项和细节

  • 低层代码尽量要有抽象类和接口
  • 变量的声明类型尽量是抽象类或接口
  • 继承时遵循里氏替换原则

1.6 里氏替换原则

  • 所有的父类都可以透明的使用子类的对象
  • 子类尽量不要修改父类的非抽象方法,尽量不要重写父类的方法
  • 迫不得已使用聚合、组合和依赖来解决问题,或者抽象个更加基础的类

1.7 合成复用原则

  • 尽量使用合成/聚合的方式,而不是使用继承
  • 依赖、组合和聚合的区别
    • 依赖: 方法入参传入接口等,关联、继承与实现是依赖关系的特例
    • 组合:成员变量,通过set方法传入,是关联关系的特例
    • 聚合:成员变量,直接new对象,是关联关系的特例

2 UML中类图的简单介绍

2.1 依赖关系

只要用到了,就拥有依赖关系

2.2 泛化关系(继承关系)

泛化关系实际就是继承关系,是依赖关系的特殊情况
比较常见的形式:子类继承了父类,接口继承另一个接口

2.3 实现关系

接口实现等,是依赖关系的特殊情况
比较常见的形式:实现类实现某个接口

2.4 关联关系

类与类的关系,具有导航性和多重性,是依赖关系的特殊情况

2.5 聚合关系

整体与部分的关系,但部分可以与整体分离,是关联关系的特殊情况
比较常见的形式:成员变量中,没有进行初始化,而是使用set方法进行初始化

2.6 组合关系

整体与部分的关系,部分与整体共生死,是关联关系的特殊情况
比较常见的形式:成员变量中,使用new进行了初始化

2.7 UML示意图

在这里插入图片描述

3 设计模式分类

模式不是代码,而是通用的解决方案

3.1 创建型设计模式(5种)

  • 单例模式
  • 工厂模式
  • 抽象工厂
  • 原型模式
  • 建造者模式

3.2 结构型设计模式(7种)

主要是站在类与类关系的角度进行设计

  • 适配器模式
  • 桥接模式
  • 代理模式
  • 装饰模式
  • 组合模式
  • 外观模式
  • 享元模式

3.3 行为型设计模式(11种)

主要是站在方法调用的角度上面进行设计

  • 策略模式
  • 观察者模式
  • 中介者模式
  • 责任链模式
  • 状态模式
  • 命令模式
  • 模板方法模式
  • 备忘录模式
  • 解释器模式(拦截器模式)
  • 访问者模式
  • 迭代器模式

4 创建型设计模式

4.1 单例模式

目的:只允许存在一个实例
实现:

  • 饿汉式:静态常量
  • 饿汉式:静态代码块
  • 懒汉式:线程不安全
  • 懒汉式:线程安全,同步方法
  • 懒汉式:线程安全,同步代码块
  • 双重检查
  • 静态内部类
  • 枚举类

4.1.1 饿汉式:静态常量

package singleton.type1;

/**
 * 饿汉式:静态常量
 * 可能会导致内存浪费
 *
 * @author yi qiang
 * @date 2021/5/2 22:07
 */
public class Singleton1 {

    public static void main(String[] args) {
        Singleton singleton=Singleton.getInstance();
        Singleton singleton1=Singleton.getInstance();
        System.out.println(singleton==singleton1);
        System.out.println(singleton.hashCode());
        System.out.println(singleton1.hashCode());
    }


}

class Singleton{

    //1.构造器私有化,使得外部不能通过new创建实例
    private Singleton(){
    }

    //2.本类内部创建一个实例
    private  static final Singleton INSTANCE=new Singleton();

    //3.对外暴露一个公共的静态方法获取实例
    public static Singleton getInstance(){
        return INSTANCE;
    }
}

4.1.2 饿汉式:静态代码块

package singleton.type2;

/**
 * 饿汉式:静态代码块
 * 可能会导致内存浪费
 * @author yi qiang
 * @date 2021/5/2 22:07
 */
public class Singleton2 {

    public static void main(String[] args) {
        Singleton singleton=Singleton.getInstance();
        Singleton singleton2=Singleton.getInstance();
        System.out.println(singleton==singleton2);
    }


}

class Singleton{

    private  static  Singleton instance;

    //1.构造器私有化,使得外部不能通过new创建实例
    private Singleton(){
    }


    //2.本类内部创建一个实例
    static {
        instance=new Singleton();
    }

    //3.对外暴露一个公共的静态方法获取实例
    public static Singleton getInstance(){
        return instance;
    }
}

4.1.3 懒汉式:线程不安全

package singleton.type3;

/**
 * 懒汉式:线程不安全 <br>
 * 线程不安全,可能会有多个线程进入if(instance==null)中,从而创建多个实例 <br>
 * 结论: 不可以使用
 * @author yi qiang
 * @date 2021/5/2 22:07
 */
public class Singleton3 {

    public static void main(String[] args) {
        Singleton singleton=Singleton.getInstance();
        Singleton singleton2=Singleton.getInstance();
        System.out.println(singleton==singleton2);
    }


}

class Singleton{

    private  static  Singleton instance;

    //1.构造器私有化,使得外部不能通过new创建实例
    private Singleton(){
    }
    

    //2.本类内部创建一个实例
    //3.对外暴露一个公共的静态方法获取实例
    public static Singleton getInstance(){
        if(instance==null){
            instance=new Singleton();
        }
        return instance;
    }
}

4.1.4 懒汉式:同步方法

package singleton.type4;

/**
 * 懒汉式:线程安全 同步方法 <br>
 * 线程安全,但是效率太低。多个线程存在时,其他线程都必须等待,而对于getInstance这种需要频繁使用的方法显然不合适 <br>
 * 结论: 效率低,不推荐使用
 * @author yi qiang
 * @date 2021/5/2 22:07
 */
public class Singleton4 {

    public static void main(String[] args) {
        Singleton singleton=Singleton.getInstance();
        Singleton singleton2=Singleton.getInstance();
        System.out.println(singleton==singleton2);
    }


}

class Singleton{

    private static Singleton instance;

    //1.构造器私有化,使得外部不能通过new创建实例
    private Singleton(){
    }
    

    //2.本类内部创建一个实例
    //3.对外暴露一个公共的静态方法获取实例
    public static synchronized Singleton getInstance(){
        if(instance==null){
            instance= new Singleton();
        }
        return instance;
    }
}

4.1.5 懒汉式:同步代码块

package singleton.type5;

/**
 * 懒汉式:线程安全 同步代码块 <br>
 * 线程安全,但并非单例。意图解决第四种方案效率低的问题,但实际并不能达到效果 <br>
 * 结论: 不可以使用
 * @author yi qiang
 * @date 2021/5/2 22:07
 */
public class Singleton5 {

    public static void main(String[] args) {
        Singleton singleton=Singleton.getInstance();
        Singleton singleton2=Singleton.getInstance();
        System.out.println(singleton==singleton2);
    }


}

class Singleton{

    private static Singleton instance;

    //1.构造器私有化,使得外部不能通过new创建实例
    private Singleton(){
    }
    

    //2.本类内部创建一个实例
    //3.对外暴露一个公共的静态方法获取实例
    public static  Singleton getInstance(){
        if(instance==null){
            synchronized (Singleton.class){
                instance= new Singleton();
            }
        }
        return instance;
    }
}

4.1.6 双重检查

package singleton.type6;

/**
 * 双重检验 <br>
 * 线程安全,单例,效率比较高 <br>
 * 结论: 推荐使用
 * @author yi qiang
 * @date 2021/5/2 22:07
 */
public class Singleton6 {

    public static void main(String[] args) {
        Singleton singleton=Singleton.getInstance();
        Singleton singleton2=Singleton.getInstance();
        System.out.println(singleton==singleton2);
    }


}

class Singleton{

    private static  volatile Singleton instance;

    //1.构造器私有化,使得外部不能通过new创建实例
    private Singleton(){
    }
    

    //2.本类内部创建一个实例
    //3.对外暴露一个公共的静态方法获取实例
    public static  Singleton getInstance(){
        if(instance==null){
            synchronized (Singleton.class){
                if(instance==null){
                    instance= new Singleton();
                }
            }
        }
        return instance;
    }
}

4.1.7 静态内部类

package singleton.type7;

/**
 * 静态内部类 <br>
 * 利用静态内部类线程安全,且只会初始化一次的特性实现单例<br>
 * 结论: 推荐使用
 * @author yi qiang
 * @date 2021/5/2 22:07
 */
public class Singleton7 {

    public static void main(String[] args) {
        Singleton singleton=Singleton.getInstance();
        Singleton singleton2=Singleton.getInstance();
        System.out.println(singleton==singleton2);
    }


}

class Singleton{


    //1.构造器私有化,使得外部不能通过new创建实例
    private Singleton(){
    }
    

    //2.本类内部创建一个实例
    private static class SingletonInner{
        private static final Singleton INSTANCE=new Singleton();
    }

    //3.对外暴露一个公共的静态方法获取实例
    public static  Singleton getInstance(){
        return SingletonInner.INSTANCE;
    }
}

4.1.8 枚举单例

package singleton.type8;

/**
 * 枚举单例 <br>
 * Effective Java推荐的方式<br>
 * 结论: 推荐使用
 * @author yi qiang
 * @date 2021/5/2 22:07
 */
public class Singleton8 {

    public static void main(String[] args) {
        Singleton singleton=Singleton.INSTANCE;
        Singleton singleton2=Singleton.INSTANCE;
        System.out.println(singleton==singleton2);
    }


}

enum  Singleton{

    /**
     * 单例模式
     */
    INSTANCE;

    private Singleton(){
    }
    

}

学习笔记( 11 ) - 解决:finalshell连接虚拟机(ubuntu)超时,主机ping不通虚拟机,主机没有VMnet8网卡, Connection refused: connect 解决:finalshell连接虚拟机(ubuntu)超时,主机ping不通虚拟机,主机没有VMnet8网卡, Connection refused: connect 阅读详情

相关推荐

扫地机器人全场景测试实战:从实验室到真实家庭的可靠性验证

本文深入探讨了扫地机器人从实验室到真实家庭的全场景测试方法,揭示了软硬件测试中的关键挑战。通过分析场景化测试的重要性,文章详细介绍了硬件耐久性、软件稳定性和环境适应性三大测试维度,并提供了真实家庭测试的实用方法论。消费者可重点关注清洁率、覆盖率等核心指标,同时了解测试工程师的私房建议,帮助选择更可靠的扫地机器人产品。

hhh00的博客 1077

设计模式概述

设计模式是一套反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 设计模式不是一种方法和技术,而是一种思想。设计模式和具体的语言无关,学习设计模式就是要建立面向对象的思想,尽可能的面向接口编程,低耦合,高内聚,使设计的程序可复用。学习设计模式能够促进面向对象思想的理解,反之亦然,相辅相成。设计模式的几个要素: 名字

冰河家园的博客 310

Java面试复习体系总结(2021版,持续更新)

Java面试复习体系总结(2021版) 一、Java基础 内容 Java基础(一):Java集合框架(超详细解析,看完面试不再怕) Java基础(二):迭代器(Iterator)(含使用方法详解) Java基础 (三):LinkedList(含使用方法详解) Java基础(四):ArrayList(含使用方法详解) Java基础(五):HashSet(使用方法详解) Java基础(六):HashMap(使用方法详解) Java基础(七):栈 Stack(使用方法详解)

Viper的程序员修炼手册 11万+

CST实战:变容二极管电容曲线提取全流程(附S参数设置技巧)

本文详细介绍了在CST Studio Suite中提取变容二极管电容-电压(C-V)曲线的完整实战流程。重点解析了S参数仿真的核心原理、DCFEED模块的正确配置、参数扫描的设置技巧,并探讨了集成SPICE模型进行精确仿真的方法,帮助射频工程师高效、准确地获取器件关键特性。

weixin_29237635的博客 529

计算机考研复试面试常问问题 数据结构篇(下)

计算机考研复试面试常问问题 数据结构篇(下) 使用前需知(拒绝白嫖,如果对你有帮助,你只需点个赞就行): 注意:有人在闲鱼上盗卖我的资料,而且还有很多同学买了,请各位擦亮双眼,我是整理出来免费分享给大家的! 大家请多点赞和评论,这样后面的同学更容易百度到,不至于被人盗卖,我就不加水印影响大家使用了! 第一次整理,度不好控制,有不好的地方希望大家理解,后面可能会改进,造福今年之后的同学们! ...

程序员宝藏的博客 1万+

Java面试复习大纲2.0(持续更新)

Java面试复习大纲2.0(持续更新)2018-02-26 奋斗蒙 Java帮帮面试复习大纲(Java帮帮总结)【人事】31道,不准备就掉坑的问题【简历】1年简历模板一【简历】2年简历模板一【简历】3年简历模板一【面试】面试练习题大集合(持续更新中...欢迎问题投稿)更多整理的问题点击公众号中间的“简历/面试”菜单即可面试+简历+沟通+工作流程+谈判_汇总想要成为合格的Java程序员或工程师到底需...

Java帮帮 6694

CUBEMX ADC 单/多通道+DMA

本文使用的是STM3F103C8T6 Cubemx进行单/多通道DMA配置。

记录学习 1405

设计模式(持续更新)

设计模式适用于大型软件的开发设计,且在设计中考虑的需要有一部分是固定不变的,但是另外的一部分是经常改变的,在选择具体设计模式的时候,一定要抓住变和不变,仔细分析需求,切忌不能乱用设计模式,一定是在大型软件中才需要使用。23种设计模式,通常分为3大类,分别是创建型,结构型以及行为型设计模式。行为型模式:关注对象的行为和对象之间的交互创建型模式:关注的是如何更加优雅的创建对象,将对象的创建独立出来,防止当对象创建逻辑出现更改的时候需要修改相关业务代码结构型模式:关注的是如何组合对象以获得更加灵活的结构。

unbelieveme的博客 896

Android面试必考问题:Android性能优化最全面试题及参考答案(8万字长文)

Android 中的 OOM(Out Of Memory,内存溢出)异常是指应用程序在运行过程中,由于申请的内存空间超过了系统所能提供的最大内存限制而导致的错误。在 Android 中,内存泄漏是指应用中的某些对象在不再被使用后,仍然被其他对象持有引用,导致这些对象无法被垃圾回收器回收,从而占用内存空间,随着时间的推移可能会导致应用内存不足,甚至崩溃。在一次开发 Android 应用的过程中,我发现应用在长时间运行后会出现内存占用过高的情况,导致应用变得卡顿,甚至可能会被系统强制关闭。

大模型大数据攻城狮的专栏 2534

解决宿主机Ping不通虚拟机的问题

在使用虚拟机的过程中,我们常常会遇到宿主机和虚拟机之间无法相互通信的问题。具体来说,我们要查看虚拟机和宿主机的 IP 地址,然后尝试进行 Ping 测试。在某些情况下,我们可能发现 Ping 虚拟机不通,接下来我将分享如何解决这个问题。

howard2005的专栏 7万+

黑马程序员Java基础学习,涉及精细知识点复习【持续更新】

文章目录01java基础java基础面向对象1.类:2.成员变量:类中方法外的变量,不能赋值3.成员方法:4.java内存分配:5.成员变量有初始值,局部变量没有初始值。6.this关键字:7.封装:8.构造方法:9.标准的JavaBean组成10.JDK帮助文档使用流程:GUI1.java.awt包:2.javax.swing包:3.GUI组件:4.事件监听机制5.“”创建的字符串对象,在字符串常量池存储,如果内容一样的字符串,本质上是同一个对象。6.基本类型包装类7.比较字符串相等02java_进阶一、

IN year 3419

Android 13 SPRD 源码默认打开多用户实际无效果问题修复

【代码】Android 13 SPRD 源码默认打开多用户实际无效果问题修复。

m0_60898338的博客 449

Android知识点复习(持续更新中)(1)

为什么不能通过返回值类型区分重载?BIO、NIO、AIO 区别?装箱和拆箱的原理?反射Java 泛型泛型类型擦除?获取 Class 对象的方法?反射中创建对象的两种方法?为什么重写 equals 时必须重写 hashCode 方法?解决Hash碰撞冲突方法?深拷贝和浅拷贝?说说 Java 异常体系?Java I/O 分为几种?那些状态下 finally 不会被执行?

2401_84123026的博客 1027

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java复习目录 基础版,持续补充相关面试题博客

Java 8+新特性:如Lambda表达式、Stream API、Optional、新的日期时间API等。B站Java面试专题:搜索“Java面试”或“Spring面试”,有很多免费视频。分模块复习:将Java基础、并发、JVM、框架等分模块复习,确保每个模块都掌握。通过以上资源和策略,你可以更高效地准备Java面试,祝你顺利找到理想的工作!保持自信:面试不仅是技术考察,也是沟通能力的体现,保持自信和积极的态度。:GitHub上的Java面试指南,涵盖基础、并发、JVM、框架等。

weixin_45762066的博客 741

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

软件评测师重难点复习手册(持续更新中)

计算机职业技术资格考试,中级软件评测师考试重点及难点知识要点,全面学习。

qq_38118903的博客 735

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Unity C# 基础复习——设计模式(持续更新)

设计模式

weixin_46711336的博客 504

探索 Kama DesignPattern:一个强大的设计模式库

探索 Kama DesignPattern:一个强大的设计模式库 去发现同类优质开源项目:https://gitcode.com/ 项目简介 是一个由 YoungYangYang04 开发并维护的开源项目,它是一个全面且深入的设计模式库,旨在帮助开发者更好地理解和应用软件设计原则与模式。该项目以 Java 语言为基础,不仅包含了传统的 GOF(Gang of Four)设计模式,还涵盖了现代编程中...

gitblog_00096的博客 446
上一篇: 建造者模式写法
下一篇: Lniux校正时间
一步一结
博客等级 码龄7年 50粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值