首页 > 编程语言 >利用java设计模式的思维优化代码

利用java设计模式的思维优化代码

时间:2024-08-21 15:26:39浏览次数:10  
标签:思维 代码 java double price public class 设计模式 void

在Java开发中,设计模式提供了一套解决常见软件设计问题的成熟方案。通过合理应用设计模式,可以提高代码的可维护性、可读性和扩展性。以下是几个常用设计模式的示例,说明如何利用设计模式思维来优化代码。

1. 工厂模式(Factory Pattern)

场景:
假设你在开发一个系统,需要创建不同类型的日志记录器,如文件日志记录器、控制台日志记录器等。如果你在代码中直接使用new关键字创建这些对象,当需要添加新的日志类型时,可能需要修改多处代码,违反了“开放-封闭原则”。
优化前代码:

public class LoggerService {
    public Logger createLogger(String type) {
        if ("file".equals(type)) {
            return new FileLogger();
        } else if ("console".equals(type)) {
            return new ConsoleLogger();
        }
        return null;
    }
}

优化后代码:
使用工厂模式,将对象创建的细节封装起来。

// Logger接口
public interface Logger {
    void log(String message);
}

// 文件日志记录器
public class FileLogger implements Logger {
    public void log(String message) {
        System.out.println("Logging to a file: " + message);
    }
}

// 控制台日志记录器
public class ConsoleLogger implements Logger {
    public void log(String message) {
        System.out.println("Logging to console: " + message);
    }
}

// Logger工厂
public class LoggerFactory {
    public static Logger createLogger(String type) {
        if ("file".equals(type)) {
            return new FileLogger();
        } else if ("console".equals(type)) {
            return new ConsoleLogger();
        }
        throw new IllegalArgumentException("Unknown logger type");
    }
}

优点:

  • 遵循开放-封闭原则:新增日志记录器时,只需扩展新的类,而不需要修改现有代码。
  • 代码更易维护和扩展。

2. 策略模式(Strategy Pattern)

场景:
假设你在开发一个电子商务系统,系统需要根据不同的支付方式(如信用卡、PayPal、支付宝)进行支付处理。最初你可能会在一个类中通过if-else来处理不同的支付方式,但随着支付方式的增加,代码会变得臃肿且难以维护。

优化前代码:

public class PaymentService {
    public void pay(String type, double amount) {
        if ("creditCard".equals(type)) {
            // 信用卡支付逻辑
        } else if ("PayPal".equals(type)) {
            // PayPal支付逻辑
        } else if ("AliPay".equals(type)) {
            // 支付宝支付逻辑
        }
    }
}

优化后代码:
使用策略模式,将不同的支付逻辑封装在独立的类中,并通过接口规范它们的行为。

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

// 信用卡支付实现
public class CreditCardPayment implements PaymentStrategy {
    public void pay(double amount) {
        System.out.println("Paid " + amount + " using Credit Card.");
    }
}

// PayPal支付实现
public class PayPalPayment implements PaymentStrategy {
    public void pay(double amount) {
        System.out.println("Paid " + amount + " using PayPal.");
    }
}

// 支付宝支付实现
public class AliPayPayment implements PaymentStrategy {
    public void pay(double amount) {
        System.out.println("Paid " + amount + " using AliPay.");
    }
}

// 支付服务类
public class PaymentService {
    private PaymentStrategy paymentStrategy;

    public PaymentService(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void pay(double amount) {
        paymentStrategy.pay(amount);
    }
}

优点:

  • 支持算法的灵活切换和扩展:新增支付方式时,只需添加新的策略类。
  • 避免代码臃肿,提高代码的可读性和可维护性。

3. 观察者模式(Observer Pattern)

场景:
假设你在开发一个股票交易系统,多个客户端需要实时获取股票价格的变化。你可以使用观察者模式,当股票价格发生变化时,系统会自动通知所有订阅该股票的客户端。

优化前代码:

public class Stock {
    private double price;

    public void setPrice(double price) {
        this.price = price;
        // 通知客户端(假设直接调用)
    }
}

优化后代码:
使用观察者模式,将客户端注册为观察者,当股票价格变化时,通知所有观察者。

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

// 观察者接口
public interface Observer {
    void update(double price);
}

// 股票类
public class Stock {
    private double price;
    private List<Observer> observers = new ArrayList<>();

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

    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    public void setPrice(double price) {
        this.price = price;
        notifyObservers();
    }

    private void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(price);
        }
    }
}

// 客户端实现
public class StockClient implements Observer {
    private String clientName;

    public StockClient(String clientName) {
        this.clientName = clientName;
    }

    @Override
    public void update(double price) {
        System.out.println("Client " + clientName + " received price update: " + price);
    }
}

优点:

  • 使得发布者与订阅者解耦:发布者不需要知道观察者的细节,只需通知它们。
  • 易于扩展:新增观察者时,不需要修改现有代码。

通过合理地应用设计模式,可以使得代码结构更加清晰、可扩展性更强,减少代码的耦合性,从而更容易进行后期的维护和扩展。

标签:思维,代码,java,double,price,public,class,设计模式,void
From: https://blog.csdn.net/Kenard/article/details/141394514

相关文章

  • Java预览PDF时的文件名称问题
     直接看问题直接看问题解决思路看了一下一个有问题的PDF文件之后发现文件的名称和文件的属性名其实不一致,浏览器默认展示的是文件的属性名,而不是我们看到的文件名称这也就让我定位到了问题的所在,出现这个bug的原因就是PDF文件的属性名称与文件名称不一致,定位到问题之后就很......
  • Java面试八股文 非常详细了!!!
    准备篇Java程序员的面试过程——总分结构凡事预则立,不预则废应届生该如何找到合适的练手项目Redis篇面试考点——一、缓存面试官:什么是缓存穿透 ?怎么解决?候选人:(穿透无中生有Key,布隆过滤NULL隔离)嗯~~,我想一下缓存穿透是指查询一个一定不存在的数据,如果从存储......
  • java计算机毕业设计中小型制造型企业erp管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和市场竞争的日益激烈,中小型制造型企业面临着前所未有的挑战与机遇。传统的手工管理模式已难以满足企业对于效率、成本控制及......
  • java计算机毕业设计学院综合管理系统设计与开发—科研数据管理子系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高等教育的快速发展与科研活动的日益频繁,学院作为科研活动的重要载体,其科研数据的管理变得愈发复杂与重要。传统的手工记录与分散存储方式已难以......
  • java计算机毕业设计校园洗衣房管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高等教育规模的不断扩大,校园生活的便捷性成为学生们日益关注的话题。在校园日常生活中,洗衣作为一项基本且频繁的需求,传统的手工洗衣方式已难以满......
  • Java计算机毕业设计的在线课堂考试系统(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,教育领域正经历着前所未有的变革。传统的教学模式受限于时间、空间及资源分配,难以满足个性化学习和高效评估的需求。特别是在......
  • java8
    我学习了如何实现一个学生管理系统利用java让我学习到了如何去解决一个问题,如何做系统构架以及如何设计类其中还学到了以下知识1.项目一个Java项目是一个包含所有相关代码、资源和配置的整体。它通常由一个或多个模块组成。项目包括源代码、库、配置文件、构建文件等。它是......
  • java线程池任务执行过程 | java线程池原理探究 | 线程池源码
    目录一、线程池的使用二、线程池的创建2.1构造方法及参数2.2拒绝策略2.2.1AbortPolicy(直接抛出异常)2.2.2 CallerRunsPolicy(将任务交给调用者处理)2.2.3 DiscardOldestPolicy(弹出队列中等待最久的任务)2.2.4 DiscardPolicy(无操作)2.2.5自定义拒绝策略(实现Rejected......
  • Java毕业设计作品(87):基于thymeleaf前后端分离 校园学习资料共享平台系统设计与实现
      博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书......
  • Java中的司机抢单实现:并发问题与解决方案
    文章目录司机抢单的基础实现乐观锁解决并发问题总结在共享经济的浪潮中,像滴滴打车这样的服务已经成为我们生活中不可或缺的一部分。对于司机和平台来说,抢单是一个关键环节,如何在保证系统高效运行的同时,确保抢单过程的公平与准确,是一个值得深入探讨的问题。在这篇博......