当前位置: 首页 > article >正文

设计模式七大设计原则Java 实践

1. 单一职责原则(Single Responsibility Principle, SRP)

单一职责原则规定一个类应该仅对一项职责负责。这意味着一个类应只关注一件事情,以便降低类之间的耦合度,提高代码的可维护性。

示例:

// 用户登录类
public class UserLogin {
    public boolean login(String username, String password) {
        // 登录逻辑
        return true;
    }
}

// 用户注册类
public class UserRegister {
    public void register(String username, String password) {
        // 注册逻辑
    }
}

通过将登录和注册分为两个独立的类,实现了单一职责原则。

2. 开闭原则(Open-Closed Principle, OCP)

开闭原则强调:对扩展开放,对修改关闭。这意味着在增加新功能时,应尽量通过扩展而非修改已有代码来实现。

示例:

// 支付接口
public interface Payment {
    void pay(double amount);
}

// 支付实现类
public class CreditCardPayment implements Payment {
    public void pay(double amount) {
        System.out.println("支付 " + amount + " 元通过信用卡完成。");
    }
}

public class BitcoinPayment implements Payment {
    public void pay(double amount) {
        System.out.println("支付 " + amount + " 元通过比特币完成。");
    }
}

新增支付方式时,只需实现 Payment 接口,而无需修改现有代码。

3. 里氏替换原则(Liskov Substitution Principle, LSP)

里氏替换原则指出,子类对象可以替换其父类对象而程序的行为保持不变。它确保了继承关系的正确性,避免因子类行为不同而破坏系统的稳定性。

示例:

// 父类
public class Rectangle {
    protected int width;
    protected int height;

    public void setWidth(int width) {
        this.width = width;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getArea() {
        return width * height;
    }
}

// 子类
public class Square extends Rectangle {
    public void setWidth(int side) {
        this.width = this.height = side;
    }

    public void setHeight(int side) {
        this.width = this.height = side;
    }
}

确保子类 Square 不违背父类 Rectangle 的行为约定。

4. 接口隔离原则(Interface Segregation Principle, ISP)

接口隔离原则要求将大的接口拆分成多个小接口,以确保类只需要实现自己需要的功能。

示例:

// 拆分接口
public interface Printer {
    void print();
}

public interface Scanner {
    void scan();
}

// 多功能设备
public class MultiFunctionDevice implements Printer, Scanner {
    public void print() {
        System.out.println("打印文档");
    }

    public void scan() {
        System.out.println("扫描文档");
    }
}

通过拆分接口,类可以根据需要实现相关功能。

5. 依赖倒置原则(Dependency Inversion Principle, DIP)

依赖倒置原则强调高层模块不应依赖于低层模块,二者都应该依赖于抽象。

示例:

// 抽象支付接口
public interface Payment {
    void pay(double amount);
}

// 高层模块
public class Order {
    private Payment payment;

    public Order(Payment payment) {
        this.payment = payment;
    }

    public void process(double amount) {
        payment.pay(amount);
    }
}

通过依赖接口 Payment 而非具体实现,提高了模块间的灵活性。

6. 合成复用原则(Composite Reuse Principle, CRP)

合成复用原则提倡优先使用对象组合而非继承来实现功能复用。

示例:

// 技能接口
public interface Skill {
    void use();
}

public class Fireball implements Skill {
    public void use() {
        System.out.println("使用火球术");
    }
}

public class IceShield implements Skill {
    public void use() {
        System.out.println("使用冰盾");
    }
}

// 角色类
public class Character {
    private Skill skill;

    public Character(Skill skill) {
        this.skill = skill;
    }

    public void performSkill() {
        skill.use();
    }
}

通过组合技能对象,而非继承实现技能复用。

7. 迪米特法则(Law of Demeter, LoD)

迪米特法则要求一个对象应尽量少地了解其他对象,减少对象之间的直接耦合。

示例:

// 服务类
public class UserService {
    public String getUserName(int userId) {
        return "用户" + userId;
    }
}

// 订单类
public class Order {
    private UserService userService;

    public Order(UserService userService) {
        this.userService = userService;
    }

    public void printOrderDetails(int userId) {
        String userName = userService.getUserName(userId);
        System.out.println("订单属于: " + userName);
    }
}

通过服务类作为中介,避免直接与用户类交互。

总结

设计模式七大设计原则是构建高质量 Java 代码的基石,它们为开发人员提供了清晰的指导,帮助我们实现更易维护、更高效和更具扩展性的代码。在实际 Java 项目中,合理应用这些原则,可以显著提高软件的质量和开发效率。


http://www.kler.cn/a/470860.html

相关文章:

  • 没有图形界面,如何快速部署一个Ubuntu 24.10的Server虚拟机
  • AICMP,开启智能挖矿新时代!
  • Elasticsearch 创建索引 Mapping映射属性 索引库操作 增删改查
  • C++:const和constexpr两个关键字
  • 【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
  • springboot+vue实现SSE服务器发送事件
  • 【OceanBase】利用 OceanBase 向量检索能力构建文档智能问答小助手
  • 6 网络编程
  • 小程序组件 —— 26 组件案例 - 跳转到商品列表
  • Unity-Mirror网络框架-从入门到精通 总目录
  • C# delegate 委托使用教程
  • 【Linux】sed编辑器
  • 周记-Repeater中的children和item区别
  • Go语言的 的抽象类(Abstract Classes)核心知识
  • 图数据库 | 17、高可用分布式设计(上)
  • Elixir语言的学习路线
  • 像素越多越好?像元的面积越小越好?
  • QT ---------------数据库编程概要
  • 自组织映射 (Self-Organizing Map, SOM) 算法详解与PyTorch实现
  • XXL-RPC v1.8.1 | RPC服务框架