【设计模式】-委托与代理模式

proxy :代理, 被代理方(B)与代理方(A)的接口完全一致。为简化编程(或无法操作B),不直接把请求交给被代理方(B),而把请求交给代理方(A),由代理方与被代理方进行通信,以完成请求。

delegate : 委托,一件事情(或一个请求)对象本身不知道怎样处理,对象把请求交给其它对象做

1、委托模式(Delegate Pattern)

一种对象组合的方式,其中一个对象将任务委托给另一个对象来执行,实现任务的分配和协作。

委托模式可以使得对象之间的耦合度降低,可以支持动态地切换委托对象等功能。委托模式的经典应用场景是事件处理机制,其中一个对象将事件委托给另一个对象来处理。

从UML结构图上得出:

抽象人物角色(Task):定义一个抽象接口,它由若干实现类。

委托者角色(Delegate):负责在各个具体角色实例之间做决策,并判断兵调用具体实现的方法。

具体任务角色(Concrete):真正执行任务的角色。

1)java中的class类双亲委派的加载机制
2)使用Method中的invoke 代理执行

复制代码
// 定义一个 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 {
    private Task task; // 定义一个 Task 类型的 task,表示任务

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

   
    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的委托
    }
}

2、代理模式(Proxy Pattern)

一种对象结构型模式,其中一个对象充当另一个对象的代理,以控制对该对象的访问。

代理模式可以实现对象的延迟加载、对象的访问控制、对象的保护代理等功能。

代理模式的经典应用场景是远程代理、虚拟代理、保护代理等。

复制代码
// 真实的业务逻辑类
class RealSubject {
    public void request() {
        System.out.println("RealSubject: Handling request.");
    }
}

// 代理类,用于控制对RealSubject的访问
class Proxy {
    private RealSubject realSubject;

    public Proxy(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    public void request() {
        if (checkAccess()) {
            realSubject.request();
            logAccess();
        }
    }

    private boolean checkAccess() {
        System.out.println("Proxy: Checking access prior to firing a real request.");
        return true;
    }

    private void logAccess() {
        System.out.println("Proxy: Logging the time of request.");
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        Proxy proxy = new Proxy(realSubject);
        proxy.request();  // 代理对象控制对真实对象的访问
    }
}
相关推荐
敲代码的 蜡笔小新几秒前
【行为型之迭代器模式】游戏开发实战——Unity高效集合遍历与场景管理的架构精髓
unity·设计模式·c#·迭代器模式
敲代码的 蜡笔小新19 小时前
【行为型之命令模式】游戏开发实战——Unity可撤销系统与高级输入管理的架构秘钥
unity·设计模式·架构·命令模式
m0_5557629020 小时前
D-Pointer(Pimpl)设计模式(指向实现的指针)
设计模式
小Mie不吃饭20 小时前
【23种设计模式】分类结构有哪些?
java·设计模式·设计规范
君鼎1 天前
C++设计模式——单例模式
c++·单例模式·设计模式
敲代码的 蜡笔小新2 天前
【行为型之中介者模式】游戏开发实战——Unity复杂系统协调与通信架构的核心秘诀
unity·设计模式·c#·中介者模式
令狐前生2 天前
设计模式学习整理
学习·设计模式
敲代码的 蜡笔小新2 天前
【行为型之解释器模式】游戏开发实战——Unity动态公式解析与脚本系统的架构奥秘
unity·设计模式·游戏引擎·解释器模式
JANYI20182 天前
嵌入式设计模式基础--C语言的继承封装与多态
java·c语言·设计模式
敲代码的 蜡笔小新2 天前
【行为型之观察者模式】游戏开发实战——Unity事件驱动架构的核心实现策略
观察者模式·unity·设计模式·c#