【设计模式】委托模式和代理模式

委托模式和代理模式都是常见的设计模式,它们都涉及到对象之间的协作和交互,但是它们的实现方式和应用场景有所不同。

委托模式(Delegate Pattern)

委托模式(Delegate Pattern)是一种对象组合的方式,其中一个对象将任务委托给另一个对象来执行,从而实现任务的分配和协作。委托模式可以使得对象之间的耦合度降低,可以支持动态地切换委托对象等功能。委托模式的经典应用场景是事件处理机制,其中一个对象将事件委托给另一个对象来处理。
委托模式示例代码

// 定义一个 Task 接口,表示任务
interface Task {
    void doTask(); // 定义一个 doTask() 方法,用于执行任务
}

// 定义一个 TaskA 类,实现 Task 接口,表示任务A
class TaskA implements Task {
    @Override
    public void doTask() { // 实现 Task 接口中的 doTask() 方法
        System.out.println("TaskA is running."); // 输出任务A正在执行
    }
}

// 定义一个 TaskB 类,实现 Task 接口,表示任务B
class TaskB implements Task {
    @Override
    public void doTask() { // 实现 Task 接口中的 doTask() 方法
        System.out.println("TaskB is running."); // 输出任务B正在执行
    }
}

// 定义一个 TaskDelegate 类,实现 Task 接口,表示任务委托
class TaskDelegate implements Task {
    private Task task; // 定义一个 Task 类型的 task,表示任务

    public TaskDelegate(Task task) { // 定义一个带参构造方法,用于创建 TaskDelegate 对象
        this.task = task;
    }

    @Override
    public void doTask() { // 实现 Task 接口中的 doTask() 方法
        task.doTask(); // 调用 task 的 doTask() 方法
    }
}

public class DelegatePatternDemo {
    public static void main(String[] args) {
        Task taskA = new TaskA(); // 创建一个 TaskA 对象
        Task taskB = new TaskB(); // 创建一个 TaskB 对象

        TaskDelegate delegateA = new TaskDelegate(taskA); // 创建一个 TaskDelegate 对象,表示任务A的委托
        TaskDelegate delegateB = new TaskDelegate(taskB); // 创建一个 TaskDelegate 对象,表示任务B的委托

        delegateA.doTask(); // 执行任务A的委托
        delegateB.doTask(); // 执行任务B的委托
    }
}

代理模式

代理模式(Proxy Pattern)是一种对象结构型模式,其中一个对象充当另一个对象的代理,以控制对该对象的访问。代理模式可以实现对象的延迟加载、对象的访问控制、对象的保护代理等功能。代理模式的经典应用场景是远程代理、虚拟代理、保护代理等。
代理模式示例代码

// 定义一个 Image 接口,表示图像
interface Image {
    void display(); // 定义一个 display() 方法,用于显示图像
}

// 定义一个 RealImage 类,实现 Image 接口,表示真实图像
class RealImage implements Image {
    private String fileName; // 定义一个字符串类型的 fileName,表示文件名

    public RealImage(String fileName) { // 定义一个带参构造方法,用于创建 RealImage 对象
        this.fileName = fileName;
        loadFromDisk(fileName); // 加载文件
    }

    @Override
    public void display() { // 实现 Image 接口中的 display() 方法
        System.out.println("Displaying " + fileName); // 输出文件名
    }

    private void loadFromDisk(String fileName) { // 定义一个 loadFromDisk() 方法,用于加载文件
        System.out.println("Loading " + fileName); // 输出加载文件信息
    }
}

// 定义一个 ProxyImage 类,实现 Image 接口,表示代理图像
class ProxyImage implements Image {
    private RealImage realImage; // 定义一个 RealImage 类型的 realImage,表示真实图像
    private String fileName; // 定义一个字符串类型的 fileName,表示文件名

    public ProxyImage(String fileName) { // 定义一个带参构造方法,用于创建 ProxyImage 对象
        this.fileName = fileName;
    }

    @Override
    public void display() { // 实现 Image 接口中的 display() 方法
        if (realImage == null) { // 如果真实图像为空
            realImage = new RealImage(fileName); // 创建一个 RealImage 对象
        }
        realImage.display(); // 显示真实图像
  
	}
}

public class ProxyPatternDemo {
public static void main(String[] args) {
Image image = new ProxyImage("test.jpg"); // 创建一个 ProxyImage 对象,表示代理图像
image.display(); // 显示图像

    System.out.println();

    image.display(); // 再次显示图像
	}
}
  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值