详解java设计模式之六大原则

详解Java设计模式之六大原则

在软件开发中,设计模式是一种解决特定问题的经验总结,它提供了一种通用的设计思路,可以使我们在编码时更加高效和准确地解决问题。Java设计模式是指在Java程序开发中应用的一种设计方式,它有六大原则,分别是:

  1. 单一职责原则
  2. 里氏替换原则
  3. 依赖倒置原则
  4. 接口隔离原则
  5. 迪米特原则
  6. 开闭原则

本文将详细讲解这六大原则。

单一职责原则

单一职责原则是说一个类应该只有一个改变的原因。也就是说,如果一个类承担了多个职责,那么这个类就很容易出现问题,比如修改一个职责可能会影响另一个职责的正常使用。所以我们需要开发符合单一职责原则的类,使其功能单一,易于维护和扩展。

例如,我们有一个用户类,既要处理用户的登录功能,又要处理用户信息的增删改查,这样的设计就不符合单一职责原则。我们可以通过拆分为User、UserLogin、UserInfo三个类,使每个类只负责单一职责,更加清晰易懂。

class User {
    private UserLogin userLogin;
    private UserInfo userInfo;
}

class UserLogin { // 处理登录
    public void login() {
        // ...
    }
}

class UserInfo { // 处理用户信息的增删改查
    public void addUser() {
        // ...
    }
    public void removeUser() {
        // ...
    }
    public void updateUser() {
        // ...
    }
    public void getUserInfo() {
        // ...
    }
}

里氏替换原则

里氏替换原则是指子类可以替换父类并可正常使用。也就是说,在使用基类的地方可以用子类替换,而不影响程序的正确性。这一原则体现了继承关系的好处,即子类继承了父类的属性和方法,同时可以扩展自己的新功能。

例如,我们有两个类Bird和Penguin,其中Penguin是Bird的子类。在实际使用中,我们可以将Penguin对象替换为Bird对象,而不影响程序执行结果。

class Bird {
    public void fly() {
        System.out.println("I can fly");
    }
}

class Penguin extends Bird {
    public void swim() {
        System.out.println("I can swim");
    }
}

// 使用Bird替换Penguin
Bird bird = new Penguin();

依赖倒置原则

依赖倒置原则是指高层模块不应该依赖低层模块,它们都应该依赖它们的抽象。另外,抽象不应该依赖细节,而细节应该依赖抽象。这一原则有助于程序的扩展和维护。

例如,我们有一个电脑类,它依赖了一个鼠标类和一个键盘类。我们可以通过抽象出一个设备接口,使得高层模块的电脑类不直接依赖低层模块的鼠标类和键盘类,而是依赖设备接口。

interface Device {
    void work();
}

class Mouse implements Device {
    public void work() {
        System.out.println("Mouse works");
    }
}

class Keyboard implements Device {
    public void work() {
        System.out.println("Keyboard works");
    }
}

class Computer {
    private Device mouse;
    private Device keyboard;

    public Computer(Device mouse, Device keyboard) {
        this.mouse = mouse;
        this.keyboard = keyboard;
    }

    public void work() {
        mouse.work();
        keyboard.work();
        System.out.println("Computer works");
    }
}

接口隔离原则

接口隔离原则是指一个类不应该依赖它不需要的接口。接口应该拆分为更小、更具体的接口,这样使用接口的实现类就只需实现自己需要的接口方法,而不需要实现其他不需要的方法。

例如,我们有一个打印机接口,其中有打印、复印、扫描、传真等方法。如果我们直接让一个普通打印机实现这个接口,那么这个打印机需要实现所有方法,而很多方法并不需要。我们可以通过拆分成Print、Copy、Scan、Fax等接口,使得普通打印机只需要实现Print接口的打印方法。

interface Print {
    void print();
}

interface Copy {
    void copy();
}

interface Scan {
    void scan();
}

interface Fax {
    void fax();
}

class NormalPrinter implements Print {
    public void print() {
        System.out.println("Normal printer prints");
    }
}

class AdvancedPrinter implements Print, Scan, Fax {
    public void print() {
        System.out.println("Advanced printer prints");
    }

    public void scan() {
        System.out.println("Advanced printer scans");
    }

    public void fax() {
        System.out.println("Advanced printer faxes");
    }
}

迪米特原则

迪米特原则是指一个类不应该知道其他类太多的信息,它们之间应该保持最少的耦合。另外,一个类对外只公开它需要公开的方法,而不是所有的方法和属性。这一原则有助于使程序结构清晰,便于维护和扩展。

例如,我们有一个学校管理系统,其中包含了很多类,如学校、学生、教师、课程等。如果我们在学生类中直接访问教师类和课程类的方法,就会造成类之间的耦合。我们可以通过引入一个中介类(如管理类)来协调类之间的关系,并只公开需要公开的方法。

class School {
    private List<Student> students;
    private List<Teacher> teachers;
    private List<Course> courses;

    public School() {
        students = new ArrayList<>();
        teachers = new ArrayList<>();
        courses = new ArrayList<>();
    }

    public void addStudent(Student student) {
        students.add(student);
    }

    public void addTeacher(Teacher teacher) {
        teachers.add(teacher);
    }

    public void addCourse(Course course) {
        courses.add(course);
    }
}

class Student {
    private String name;
    private int age;

    public void getName() {
        System.out.println(name);
    }

    public void setName(String name) {
        this.name = name;
    }

    public void getAge() {
        System.out.println(age);
    }

    public void setAge(int age) {
        this.age = age;
    }
}

// 在调用学生类时,只需要知道学生类的方法,不需要知道教师类和课程类的方法
School school = new School();
Student student = new Student();
school.addStudent(student);

开闭原则

开闭原则是指一个类应该对扩展开放,对修改关闭。也就是说,在修改一个类时,应该尽量避免直接修改它的代码。而是通过添加新的代码或者组合现有代码的方式来扩展功能。

例如,我们有一个打印机类,在打印文件的时候需要选择打印方式。如果我们在类中直接写入了打印方式的逻辑,那么在需要添加新的打印方式时就需要修改这个类的代码。我们可以通过使用策略模式,将打印方式的选择交给一个策略类来处理。

interface PrintStrategy {
    void print();
}

class PrintStrategy1 implements PrintStrategy {
    public void print() {
        System.out.println("Strategy 1 prints");
    }
}

class PrintStrategy2 implements PrintStrategy {
    public void print() {
        System.out.println("Strategy 2 prints");
    }
}

class Printer {
    private PrintStrategy printStrategy;

    public void setPrintStrategy(PrintStrategy printStrategy) {
        this.printStrategy = printStrategy;
    }

    public void print() {
        printStrategy.print();
    }
}

以上就是Java设计模式的六大原则的详细讲解。通过遵循这些原则,我们可以开发出逻辑清晰、易于维护、容易扩展的程序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解java设计模式之六大原则 - Python技术站

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

相关文章

  • Spring请求参数校验功能实例演示

    我来为您讲解“Spring请求参数校验功能实例演示”的完整攻略,首先我们需要了解以下几点: Spring请求参数校验依赖于Hibernate Validator(JSR 380)。 在Controller层使用@Valid注解对参数进行校验。 在参数对象中使用Hibernate Validator的注解对属性进行校验。 接下来我们将透过两个示例来进行具体演示…

    Java 2023年5月20日
    00
  • Java中LinkedList详解和使用示例_动力节点Java学院整理

    Java中LinkedList详解和使用示例 LinkedList简介 LinkedList 是 Java Collections 中的一种 List 集合实现,它基于双向链表数据结构实现。LinkedList 能够支持快速的插入和删除操作,但是访问集合中的任意元素则会比较慢。 LinkedList的特点 LinkedList 内部使用链表数据结构实现,插入…

    Java 2023年5月26日
    00
  • Java 锁的知识总结及实例代码

    Java 锁的知识总结及实例代码 在 Java 中,锁机制是一个非常重要的多线程编程的知识点。下面对 Java 锁相关的知识进行总结,并提供两个示例代码说明锁机制的应用。 概念 互斥锁(mutex):用于控制对共享资源的访问。对于任一个时刻,只有一个线程可以访问共享资源,其他的线程必须等待。 读写锁(ReadWriteLock):允许多个线程同时读共享资源,…

    Java 2023年5月23日
    00
  • java 非常好用的反射框架Reflections介绍

    Java 反射框架 Reflections 介绍 什么是 Reflections Reflections 是一个非常好用的 Java 反射框架,可以用于查找和获取 Java 类中的注解、方法、属性等信息。通过 Reflections 可以方便地实现自动化扫描和创建组件、注册 Bean 等功能。 Reflections 的使用方法 使用 Reflections…

    Java 2023年5月26日
    00
  • springMvc全局异常的实现

    下面给出详细的springMvc全局异常的实现攻略。 实现过程 1. 创建异常处理类 创建一个类并实现HandlerExceptionResolver接口,该接口提供了一个resolveException方法,用于处理异常。 @Component public class CustomExceptionHandler implements HandlerEx…

    Java 2023年5月27日
    00
  • HttpServletRequest对象常用功能_动力节点Java学院整理

    HttpServletRequest对象常用功能 概述 HttpServletRequest是Java Servlet API提供的接口,它代表客户端的请求,提供了丰富的方法获取客户端的相关信息。下面我们就来了解HttpServletRequest的常用功能。 获取请求参数 HttpServletRequest提供了两种获得请求参数的方法:getParame…

    Java 2023年6月1日
    00
  • java.lang.NoClassDefFoundError错误解决办法

    下面我将详细讲解如何解决”java.lang.NoClassDefFoundError”错误。 1. 什么是”java.lang.NoClassDefFoundError”错误 “java.lang.NoClassDefFoundError”错误是Java程序编译或运行过程中遇到的一个常见错误,表示无法找到相关类的定义。它通常是由以下原因导致的: 缺少相关类…

    Java 2023年5月20日
    00
  • springboot项目集成swagger-bootstrap-ui全过程

    下面就为大家详细讲解“springboot项目集成swagger-bootstrap-ui全过程”的完整攻略。 1. 前置条件 在集成Swagger Bootstrap UI之前,您需要确保满足以下两个前置条件: 已经拥有一个基于Spring Boot框架的Web应用程序。 已经清楚了解Swagger的基本概念和使用方式。 如果您还不了解Swagger,可以…

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