MST

星途 面试题库

面试题:Java基础类设计中多种设计模式的综合优化

假设你要对Java的Date类进行扩展和优化,要求同时应用策略模式、装饰器模式和单例模式。请说明设计思路,包括如何划分职责、处理类之间的关系,并给出完整的Java代码实现示例。
36.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 策略模式:用于封装不同的日期处理策略,比如日期格式化策略、日期计算策略等。不同的策略可以独立变化,互不影响。
  2. 装饰器模式:用于在不改变原Date类结构的前提下,动态地为Date对象添加新的功能,比如添加日志记录功能、权限验证功能等。
  3. 单例模式:确保整个应用程序中只有一个Date扩展类的实例,避免重复创建对象带来的资源浪费。

职责划分

  1. 策略接口及实现类:定义日期处理策略的接口,具体实现类实现不同的日期处理逻辑。
  2. 装饰器抽象类及具体装饰器:装饰器抽象类继承自Date扩展类,具体装饰器实现为Date对象添加额外功能。
  3. Date扩展类(单例):继承自Java原生Date类,实现单例模式,并包含策略模式和装饰器模式相关的引用和方法。

类之间的关系

  1. Date扩展类:是单例类,持有策略接口的引用,同时作为装饰器抽象类的基类。
  2. 策略接口及实现类:策略接口定义方法,具体实现类实现这些方法,与Date扩展类通过组合方式关联。
  3. 装饰器抽象类及具体装饰器:装饰器抽象类继承Date扩展类,具体装饰器继承装饰器抽象类,并在构造函数中持有Date扩展类的引用。

Java代码实现示例

import java.util.Date;

// 策略接口
interface DateStrategy {
    String processDate(Date date);
}

// 具体策略实现类
class DateFormatStrategy implements DateStrategy {
    @Override
    public String processDate(Date date) {
        // 简单的日期格式化示例
        return date.toString();
    }
}

// 装饰器抽象类
abstract class DateDecorator extends ExtendedDate {
    protected ExtendedDate extendedDate;

    public DateDecorator(ExtendedDate extendedDate) {
        this.extendedDate = extendedDate;
    }
}

// 具体装饰器实现类
class LoggingDateDecorator extends DateDecorator {
    public LoggingDateDecorator(ExtendedDate extendedDate) {
        super(extendedDate);
    }

    @Override
    public String processDate() {
        System.out.println("Logging before processing date...");
        String result = extendedDate.processDate();
        System.out.println("Logging after processing date...");
        return result;
    }
}

// Date扩展类(单例)
class ExtendedDate extends Date {
    private static ExtendedDate instance;
    private DateStrategy dateStrategy;

    private ExtendedDate() {
    }

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

    public void setDateStrategy(DateStrategy dateStrategy) {
        this.dateStrategy = dateStrategy;
    }

    public String processDate() {
        if (dateStrategy != null) {
            return dateStrategy.processDate(this);
        }
        return super.toString();
    }
}

public class Main {
    public static void main(String[] args) {
        ExtendedDate extendedDate = ExtendedDate.getInstance();
        extendedDate.setDateStrategy(new DateFormatStrategy());

        // 使用装饰器
        ExtendedDate decoratedDate = new LoggingDateDecorator(extendedDate);
        System.out.println(decoratedDate.processDate());
    }
}