Java面试题冲刺第十五天–设计模式

标题:Java面试题冲刺第十五天--设计模式

设计模式是软件开发中常用的一种解决问题的思想,起源于1988年,由四位作者(Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides)集体著作了一本《设计模式:可复用面向对象软件的基础》。设计模式主要包括三种类型:创建型、结构型和行为型。本文将从设计模式的概念、分类和代码实现等方面为大家讲解设计模式的知识点。

设计模式的概念

设计模式是一套已被广泛接受的有关设计、实现和使用对象的经验性总结,在软件开发中具有非常重要的作用。它为软件开发中常见的问题提供了一种解决方案,帮助开发人员更快、更好地编写高质量的代码,达到提高代码的可读性、可维护性和可扩展性的目的。

在软件开发中,设计模式可以帮助开发人员快速解决特定的问题,提高软件的质量和效率。设计模式可以在不同的场景中使用,例如:单例模式可以用来保证对象的唯一性;工厂模式可以用来创建不同类型的对象;适配器模式可以用来把不兼容的接口转换为兼容的接口等等。

设计模式的最终目的是提高代码的复用性和可维护性,同时也提高软件的可扩展性,减轻了开发过程中的重复性工作开销。

设计模式的分类

  1. 创建型设计模式

创建型设计模式主要关注的是对象的创建过程,它主要包括以下类型:

  • 单例模式(Singleton)
  • 工厂模式(Factory)
  • 抽象工厂模式(Abstract Factory)
  • 生成器模式(Builder)
  • 原型模式(Prototype)

  • 结构型设计模式

结构型设计模式主要关注的是对象的组合,它主要包括以下类型:

  • 适配器模式(Adapter)
  • 桥接模式(Bridge)
  • 组合模式(Composite)
  • 装饰模式(Decorator)
  • 外观模式(Facade)
  • 享元模式(Flyweight)
  • 代理模式(Proxy)

  • 行为型设计模式

行为型设计模式主要关注的是对象之间的交互,它主要包括以下类型:

  • 责任链模式(Chain of Responsibility)
  • 命令模式(Command)
  • 解释器模式(Interpreter)
  • 迭代器模式(Iterator)
  • 中介者模式(Mediator)
  • 备忘录模式(Memento)
  • 观察者模式(Observer)
  • 状态模式(State)
  • 策略模式(Strategy)
  • 模板方法模式(Template Method)
  • 访问者模式(Visitor)

示例说明

以创建型设计模式中的单例模式为例,代码实现如下:

public class Singleton {
    private static Singleton instance = null;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

上述代码实现了单例模式,保证程序中只创建了一个Singleton类的实例。这里采用了懒汉式的方式,即直到用户调用getInstance方法时才创建实例。此实现方式可能会出现线程安全性问题,因此在多线程环境中建议使用双重检查锁定方式来解决。

以行为型设计模式中的观察者模式为例,代码实现如下:

import java.util.ArrayList;
import java.util.List;

public class Subject {
    private List<Observer> observers = new ArrayList<>();
    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        notifyAllObservers();
    }

    public void attach(Observer observer) {
        observers.add(observer);
    }

    public void notifyAllObservers() {
        for (Observer observer : observers) {
            observer.update();
        }
    }
}

public abstract class Observer {
    protected Subject subject;
    public abstract void update();
}

public class BinaryObserver extends Observer {

    public BinaryObserver(Subject subject){
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Binary String: " + Integer.toBinaryString(subject.getState()));
    }
}

public class OctalObserver extends Observer {

    public OctalObserver(Subject subject){
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Octal String: " + Integer.toOctalString(subject.getState()));
    }
}

public class HexObserver extends Observer {

    public HexObserver(Subject subject){
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Hex String: " + Integer.toHexString(subject.getState()).toUpperCase());
    }
}

public class ObserverPatternDemo {
    public static void main(String[] args) {
        Subject subject = new Subject();
        new BinaryObserver(subject);
        new OctalObserver(subject);
        new HexObserver(subject);
        System.out.println("First state change: 15");
        subject.setState(15);
        System.out.println("Second state change: 10");
        subject.setState(10);
    }
}

上述代码实现了观察者模式,当Subject类的状态发生变化时,它将通知其所有的观察者。在示例中,BinaryObserver、OctalObserver和HexObserver是三个观察者类,它们都继承自Observer类。Subject类是被观察的目标类。在ObserverPatternDemo类中创建了一个Subject实例,并注册了三个观察者。当Subject类的状态发送变化时,观察者类将会相应地输出不同的字符串。

以上两个例子展示了创建型和行为型两种设计模式的代码实现。实际开发中,设计模式的使用需要考虑到具体的情境及需求,在具备一定经验和技能的情况下合理地选择和使用设计模式,对于提升代码质量、可读性、可维护性以及扩展性有着重要的作用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java面试题冲刺第十五天–设计模式 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Spring-webflux 响应式编程的实例详解

    Spring-webflux 响应式编程的实例详解 响应式编程的概念 响应式编程是一种处理异步数据流的编程范式,其主要思想是通过数据流的变化来触发相应的操作。这种编程模型可以帮助我们更加高效地处理并发、I/O密集型的操作,对于微服务架构的实现尤其有帮助。 Spring-webflux概述 Spring-webflux是基于响应式编程的Spring框架的一个子…

    Java 2023年6月3日
    00
  • SpringBoot外部化配置示例解析

    下面我将为你详细讲解“SpringBoot外部化配置示例解析”的完整攻略。 简介 在开发过程中,我们通常会使用外部配置文件,比如properties或者yaml格式的配置文件。其中,Spring Boot利用spring-boot-configuration-processor自动获取并识别配置文件中的属性,使得在Java代码中可以直接使用@Autowire…

    Java 2023年5月19日
    00
  • layui的数据表格+springmvc实现搜索功能的例子

    下面是详细讲解“layui的数据表格+springmvc实现搜索功能的例子”的完整攻略: 一、前置条件 确定使用的IDE是IntelliJ IDEA; 确保已经创建了一个Spring MVC的web工程; 确保已经配置好了Layui相关的静态资源。 二、添加依赖 添加spring-data-jpa、MySQL JDBC驱动、Spring Web MVC等依赖…

    Java 2023年6月18日
    00
  • Hibernate中Session.get()方法和load()方法的详细比较

    让我来详细讲解“Hibernate中Session.get()方法和load()方法的详细比较”。 一、概述 Hibernate是广泛使用的ORM框架之一,其最基本的操作是通过Session实例来执行。在Session实例中,get()方法和load()方法是最常用的两个方法之一。它们用于从数据库中检索对象,但它们有一些微小的区别。 在这篇文章中,我们将会比…

    Java 2023年5月20日
    00
  • Java经典面试题汇总:JVM

    Java经典面试题汇总:JVM JVM是什么? JVM(Java Virtual Machine,即Java虚拟机)是Java平台的一个重要组成部分,也是整个Java技术体系的核心所在。它是Java实现“一次编写,到处运行”的重要基石,同时也是Java能够拥有强大的跨平台能力的主要原因之一。 当我们运行Java程序时,JVM会解释并执行Java字节码,最终把…

    Java 2023年5月23日
    00
  • Java框架Struts2实现图片上传功能

    接下来我将分享关于Java框架Struts2实现图片上传功能的完整攻略,包括两个示例。 1. 配置上传文件的目录 为了上传图片,我们需要在Struts2配置文件中定义一个上传目录。这可以在struts.xml文件中的<constant>标签中添加以下行完成: <constant name="struts.multipart.sav…

    Java 2023年5月19日
    00
  • IIS和tomcat5多站点配置流程

    针对你提出的问题,“IIS和tomcat5多站点配置流程”的完整攻略,以下是步骤和示例: 1. 配置IIS IIS是Windows操作系统默认带的Web服务器,它可以作为一个反向代理服务器,把所有请求转发到Tomcat服务器。下面介绍如何配置IIS,使其可以代理多个Tomcat站点。 1.1 安装IIS 在Windows服务器上打开“服务器管理器”,选择“添…

    Java 2023年5月19日
    00
  • Mybatis实现Mapper动态代理方式详解

    Mybatis实现Mapper动态代理方式详解 什么是Mapper动态代理 Mapper动态代理是Mybatis框架中的一种技术,在Mybatis中通过定义Mapper接口,在运行时自动生成接口的代理对象。使用Mapper动态代理可以使我们更加方便地编写接口,不需要编写SQL语句,提高代码的可读性和可维护性。 实现步骤 1. 定义Mapper接口 首先,我们…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部