Java编程--委派设计模式

发布时间 2023-12-20 08:19:53作者: 谁风霜依旧

委派设计模式

委派 (Delegation)

委派(Delegation)是一种设计模式,通常用于实现代码的解耦和复用。简单来说,委派是指一个对象将自己的部分职责,即一些特定的任务,转交(委派)给其他对象来处理。这种模式允许对象组合实现功能,而不是通过继承。

委派模式的关键特征:

  • 封装行为:委派对象持有对另一对象的引用,这个被引用的对象提供了特定的服务或行为。
  • 解耦:通过委派,一个类不需要实现所有功能,而是可以利用其他对象的功能。这有助于减少类之间的依赖关系。
  • 复用:委派可以在多个不同的类中重用同一个对象,实现代码的复用。

举个例子:

假设有一个打印任务类 PrintTask,它可以把打印的细节(例如打印到控制台或文件)委派给另一个类 Printer。PrintTask 只需要告诉 Printer 需要打印什么,而不必关心打印是如何实现的。

负责打印的任务类,负责把打印的细节委派给具体的PrinterInterface的打印接口。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class PrintTask {

    private PrinterInterface printer;

    public void executePrint(String message) {
        printer.print(message);
    }
}

打印接口,定义打印要执行的方法

/**
 * 打印接口
 */
public interface PrinterInterface {
    void print(String message);
}

打印接口实现,打印到控制台

/**
 * 控制台打印器
 */
public class ConsolePrinter implements PrinterInterface {
    @Override
    public void print(String message) {
        System.out.println("Printing to console: " + message);
    }
}

打印接口实现,打印到文件

/**
 * 文件打印器
 */
public class FilePrinter implements PrinterInterface {
    private String filePath;

    public FilePrinter(String filePath) {
        this.filePath = filePath;
    }

    @Override
    public void print(String message) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath, true))) {
            writer.write(message);
            writer.newLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端调用,决定由哪个接口去打印

public class DelegationDemo {
    public static void main(String[] args) {
        PrinterInterface consolePrinter = new ConsolePrinter();
        PrinterInterface filePrinter = new FilePrinter("output.txt");

        PrintTask printTask = new PrintTask();
        // 委派给控制台打印器去执行
        printTask.setPrinter(consolePrinter);
        printTask.executePrint("Hello, printing to console!");

        // 委派给文件打印器去执行
        printTask.setPrinter(filePrinter);
        printTask.executePrint("Hello, printing to file!");
    }
}

委派和继承的对比:

  • 继承:是一种“是一个”(is-a)关系,子类继承父类的属性和方法。
  • 委派:则更多体现为“有一个”(has-a)关系,委派类通过持有另一个类的实例来利用其功能。

委派模式在许多现代编程语言和框架中都有广泛应用,它有助于创建松耦合、易于维护和扩展的代码结构。

链接:
https://www.cnblogs.com/zjw-blog/p/17915298.html