委派设计模式

news2024/11/19 19:29:39

一、委派模式

1、定义

委派模式(Delegate Pattern)又称作委托模式,是一种面相对性的设计模式,允许对象组合实现与继承相同的代码重用,属于行为型设计模式,不属于GoF的23种设计模式。

委派模式的基本作用是负责任务的调用和分配,是一种特殊的静态代理模式,可以理解为全权代理模式,但是代理模式注重过程,而委派模式注重结果。

2、结构

(1)模式的结构

主要角色如下:

  • 抽象任务角色(ITask):定义一个抽象接口,它有若干实现类。
  • 委派者角色(Delegate):负责在各个具体角色实例之间作出决策,判断并调用具体实现的方法。
  • 具体任务角色(Concrete):真正执行任务的角色。

3、优缺点

优点:

  • 通过任务委派能够将一个大型任务细化,然后通过统一管理这些子任务的完成情况,来实现任务的跟进,加快任务执行的效率。

缺点:

  • 任务委派方式需要根据任务的复杂程度进行不同的改变,在任务比较复杂的情况下,可能需要进行多重任务委派,容易造成紊乱。

4、使用场景

  • 需要实现表现层和业务层之间的松耦合。
  • 需要编排多个服务之间的调用。
  • 需要封装一层服务查找和调用

5、在框架源码中使用

  • JVM在加载类时使用的双亲委派机制,在 ClassLoader类中的 loadClass()方法。
  • Spring IoC模块中,BeanDefinition进行解析注册的过程中使用的 BeanDefinitionParserDelegate类型的类。
  • Spring源码中,以 Delegate为后缀的类基本都实现了委派模式。

二、模式的通用实现

代码如下:

public class DelegatePattern {
	public static void main(String[] args) {
		for (int i = 0; i < 3; i++) {
			Delegate delegate = new Delegate();
			delegate.doTask();
			System.out.println("---------");
		}
	}
}

// 抽象任务角色
interface ITask {
	void doTask();
}

// 具体任务角色
class ConcreteTaskA implements ITask {

	@Override
	public void doTask() {
		System.out.println("ConcreteTaskA 执行 任务");
	}
}

class ConcreteTaskB implements ITask {

	@Override
	public void doTask() {
		System.out.println("ConcreteTaskB 执行 任务");
	}
}

// 委派者角色
class Delegate implements ITask {

	@Override
	public void doTask() {
		System.out.println("随机委派执行开始");
		ITask task = null;
		if(new Random().nextBoolean()){
			task = new ConcreteTaskA();
			task.doTask();
		}else{
			task = new ConcreteTaskB();
			task.doTask();
		}
		System.out.println("随机委派执行结束");
	}
}

在这里插入图片描述

三、模式的应用实例

以项目经理给员工分配任务为例。

(1)员工

public interface Employee {

    String doTask(String task);
}
public class JavaEmployee implements Employee{

    private String name = "Java后端";

    @Override
    public String doTask(String task) {
        return "我" + name + ",开始努力工作,完成【" + task + "】任务";
    }
}

public class JsEmployee implements Employee{

    private String name = "Js前端";

    @Override
    public String doTask(String task) {
        return "我" + name + ",开始努力工作,完成【" + task + "】任务";
    }
}

(2)项目经理 - 委派者

public class Leader {
    //private Map<String, Employee> employeeMap;
    //
    //public Leader() {
    //    this.employeeMap = new ConcurrentHashMap<>();
    //    employeeMap.put(JavaEmployee.class.getSimpleName(), new JsEmployee());
    //    employeeMap.put(JsEmployee.class.getSimpleName(), new JsEmployee());
    //}

    public void doSomeThing(Employee employee, String taskName) {
        System.out.println("委派执行开始");

        if(employee == null){
            System.out.println("请执行委派人员");
            return;
        }
        String result = "";
        employee.getClass().getName();

        if(employee instanceof JavaEmployee){
            //employee = employeeMap.get(JavaEmployee.class.getSimpleName());
            result = employee.doTask(taskName);
        }else if(employee instanceof JsEmployee){
            //employee = employeeMap.get(JsEmployee.class.getSimpleName());
            result = employee.doTask(taskName);
        }else {
            System.out.println("部门不存在该委派人员");
            return;
        }

        System.out.println(result);
        System.out.println("委派执行开始");
    }
}

(3)测试

	public static void main(String[] args) {
		Leader leader = new Leader();

		leader.doSomeThing(new JavaEmployee(), "赵云打野");
		System.out.println("-----------");
		leader.doSomeThing(new JsEmployee(), "瑶妹辅助");

	}

在这里插入图片描述

– 求知若饥,虚心若愚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/62678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity与IOS⭐一、百度语音IOS版Demo调试方法

文章目录 🟥 SDK下载与配置官网包名1️⃣ SDK下载地址2️⃣ 配置官网的包名3️⃣ 百度语音IOS版教程地址🟧 配置SDK Demo1️⃣ 配置License2️⃣ 配置唤醒词文件3️⃣ 打包🟨 Demo测试🟥 SDK下载与配置官网包名 1️⃣ SDK下载地址 SDK下载地址:https://ai.baidu.com…

JAVA中如何精确取到时间间隔

文章目录0 写在前面1 使用方法2 举例3 写在最后0 写在前面 做业务的时候&#xff0c;总要统计数据&#xff0c;几月份到几月份的全部数据。这个时候就要找到起始月份的具体时间和终止月份的具体时间。 此时我们用原始的Date类去处理就比较麻烦&#xff0c;可以自己写一个工具类…

jsp网络申报审批系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 网络申报审批系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使用…

[矩阵论] Unit 1. 线性空间与线性变换 - 知识点整理

注: 以下内容均由个人整理, 不保证完全准确, 如有纰漏, 欢迎交流讨论参考: 杨明, 刘先忠. 矩阵论(第二版)[M]. 武汉: 华中科技大学出版社, 2005 1 线性空间与线性变换 1.1 线性空间 线性空间 Def 1.1: 设 VVV 是一个非空集合(V≠∅V\neq \varnothingV​∅)&#xff0c;FF…

Unity与IOS⭐最基础的交互演示

文章目录 🟥 本章的交互效果🟧 创建IOS代码1️⃣ 创建代码文件2️⃣ 代码文件🚩 Interaction.h🚩 Interaction.m🟨 测试试试吧🟥 本章的交互效果 本章演示unity调用IOS代码,IOS并返回值。 🟧 创建IOS代码 我们的Unity代码一个脚本就好了,而IOS代码需要两个脚…

【AI】Python 实现 KNN 手写数字识别

KNN 算法 1. 题目介绍 K近邻&#xff08;K-Nearest Neighbor, KNN&#xff09;是一种最经典和最简单的有监督学习方法之一。K-近邻算法是最简单的分类器&#xff0c;没有显式的学习过程或训练过程&#xff0c;是懒惰学习&#xff08;Lazy Learning&#xff09;。当对数据的分…

如何搭建一个自己的音乐服务器 审核中

点赞再看&#xff0c;动力无限。 微信搜「 程序猿阿朗 」。 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录&#xff0c;有很多知识点和系列文章。 最近发现&#xff0c;经常用的网易云音乐&#xff0c;有很多歌曲下架了&#xff0c;能听的越来越少了&#xff1b;…

设计模式之中介者模式(十五)

目录 1. 背景 1.1 智能家庭管理项目 1.2 中介者模式概述 2. 中介者模式 2.1 中介者模式解决上述问题 1. 背景 1.1 智能家庭管理项目 智能家庭项目&#xff1a; 智能家庭包括各种设备&#xff0c;闹钟、咖啡机、电视机、窗帘 等。主人要看电视时&#xff0c;各个设备可以协…

7 支持向量机

支持向量机 支持向量机(SVM)是在统计学习理论基础上发展起来的一种数据挖掘方法&#xff0c;1992 年由Boser, Guyon和Vapnik提出&#xff0c;在解决小样本、非线性、高维的回归和分类问题上&#xff0c; 有许多优势。 1 支持向量分类概述 支持向量分类以训练样本集为数据对象…

支持向量机核技巧:10个常用的核函数总结

支持向量机是一种监督学习技术&#xff0c;主要用于分类&#xff0c;也可用于回归。它的关键概念是算法搜索最佳的可用于基于标记数据(训练数据)对新数据点进行分类的超平面。 一般情况下算法试图学习一个类的最常见特征(区分一个类与另一个类的特征)&#xff0c;分类是基于学…

[附源码]JAVA毕业设计律师事务所网站(系统+LW)

[附源码]JAVA毕业设计律师事务所网站&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&a…

ubuntu20.04安装anaconda3搭建python环境

1.清华源下载anaconda3 清华源anaconda软件镜像网站&#xff1a; Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载完成在终端打开Downloads 运行 bash Anaconda3-5.3.1-Linux-x86_64.sh 进入到下载页面 紧接着你可以使用conda --…

HTTP抓包神器---Fiddler

今天我们介绍一个好用的抓包工具.是针对于HTTP协议的抓包工具. Fiddler 下载地址 下载工具当然是要去官网下载啦. 这里为了防止有些人在网上找不到下载路径.我们直接把下载路径放在下面. https://www.telerik.com/download/fiddler 下载 点击上述链接以后会直接跳转到下…

蓝海创意云·11月大事记 || 12月,暖心相伴

秋尽冬生&#xff0c;日短天寒 告别了立冬与小雪 时光不紧不慢开启了新一月的篇章 万物冬藏&#xff0c;沉淀酝酿 站在十二月的路口 蛰伏打磨&#xff0c;静待厚积而薄发 导 读 ● 客户端更新&#xff1a;新增PSD通道合成选项 ● 渲染案例&#xff1a;绝代双骄重启江湖…

K8S - Pod 的概念和简介

1. POD的基本概念 Pod 是K8s 系统中可以创建&#xff08;部署&#xff09;和管理的最小单元。 Pod 里面可以包含多个容器(多实例&#xff09;&#xff0c;是一组容器的集合。 也就是讲K8S 不会直接管理容器 1个POD中的容器共享网络命名空间&#xff08;共享ip&#xff09; P…

MongoDB_前期准备(一)

目录一、数据库&#xff08;Database&#xff09;数据库分类1、关系型数据库&#xff08;RDBMS&#xff09;2、非关系型数据库&#xff08;No SQL&#xff09;二、MongoDB简介1&#xff09;MongoDB VS MySql2&#xff09;MongoDB中的三个概念3&#xff09; MongoDB安装一、数据…

Reading Note(10)——AutoBridge

这篇论文是FPGA 2021年的best paper award&#xff0c;主要解决的是在HLS编译过程中优化布局和布线&#xff0c;最终达到整个multi-die的FPGA板上的大规模HLS设计时钟频率尽可能提升的目的&#xff0c;这篇工作在当前chiplet工艺铺展开来的当下更加有现实意义&#xff0c;通过这…

代码随想录训练营第41天|LeetCode 343. 整数拆分、 96.不同的二叉搜索树

参考 代码随想录 题目一&#xff1a;LeetCode 343.整数拆分 确定dp数组及其下标的含义 dp[i]为整数i拆分后得到的最大化乘积。确定递推公式 dp[i]可以有两种方式得到&#xff1a; dp[i] j * (i-j)&#xff0c;即只拆分成两个数&#xff0c;其中1 < j < i/2&#xff…

Nginx的高可用集群

1、什么是 nginx高可用 只有一台nginx服务器时&#xff0c;如果nginx服务器宕机了&#xff0c;那么请求就无法访问。 要实现高可用&#xff0c;那就可以部署多台nginx服务器&#xff0c;下面以两台nginx服务器为例&#xff0c;示意图如下&#xff1a; 要配置nginx集群&#xf…

西部学刊杂志西部学刊杂志社西部学刊编辑部2022年第22期目录

百年党建与马克思主义中国化研究 党的纪律建设的实践、启示与创新——基于“三大纪律八项注意”的研究 武艳; 5-8 西部研究《西部学刊》投稿&#xff1a;cn7kantougao163.com 新疆红色资源运用现状调查研究——以南疆部分地区为例 王艺潼;努尔古扎丽阿不都克里木; 9-12…