从工厂方法到注解的小例子

news2024/11/20 2:46:47

目录

  • 一、背景介绍
  • 二、思路&方案
  • 三、过程
    • 过程图一
    • 过程图二
    • 过程图三
    • 过程图四(运行时的图)
    • 代码
  • 四、总结
  • 五、升华

一、背景介绍

上篇"自定义注解和注解解析器",通过小例子介绍了自定义注解的运用;本篇继续基于小例子来实现工厂方法,以及注解实现工厂方法

二、思路&方案

  • 1.米老师依赖何老师;强耦合的依赖关系图
  • 2.米老师依赖何老师;通过Class实现弱耦合的依赖关系图
  • 3.米老师依赖何老师;通过工厂方法实现自动化的弱耦合的依赖关系图
  • 4.米老师依赖何老师;通过注解替换工厂方法实现自动化的弱耦合的依赖关系图

三、过程

这里的前几个过程就不符代码了,请读者自行补充;只附上第四版,通过注解替换工厂方法实现自动化的小例子

过程图一

在这里插入图片描述

过程图二

在这里插入图片描述

过程图三

在这里插入图片描述

过程图四(运行时的图)

在这里插入图片描述

代码

package oldMark7_Anotation_v1;


/**
 * 1.每个类调用的时候,通过判断注解来进行反射对象
 *
 * 2.注解中的参数,可以通过配置文件获取(注解中的参数,可以当做类的一个属性,然后获取配置文件中的值)
 */
public class Client {


    public static void main(String[] args){
        Notice notice = new Notice();
        notice.send();
    }
}

package oldMark7_Anotation_v1;

public abstract class Executant {

    public String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public abstract void OpenDoor(Executant executant);

}

package oldMark7_Anotation_v1;

public class Helaoshi extends Executant {

    public Helaoshi(String name) {
        this.name = name;
    }

    public Helaoshi(){}

    public void OpenDoor(Executant executant){
        this.privateOpenDoor(executant);
    }

    private void  privateOpenDoor(Executant executant){
        System.out.println("我是"+this.name+",我去开门了!");
    }

}

package oldMark7_Anotation_v1;

public class Milaoshi extends Executant {

    public Milaoshi(String name) {
        this.name = name;
    }

    public Milaoshi(){}


    private void privateOpenDoor(Executant executant){

        System.out.println(this.name+"调用"+executant.getName()+"开门的方法");
        executant.OpenDoor(executant);
    }

    public void OpenDoor(Executant executant){
        this.privateOpenDoor(executant);
    }

}

package oldMark7_Anotation_v1;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyResource {
    String packageName();

}

package oldMark7_Anotation_v1;

import java.lang.reflect.Field;

public class MyResourceExplanationFactoryImpl {


    public static void createBean(Object object){
        createBeanPrivate(object);
    }

    private static void createBeanPrivate(Object object){
        try {
            //1.获取传进来的对象的类模板
            Class<?> clazzObj = object.getClass();

            Field[] fields = clazzObj.getFields();
            for (Field field:fields) {

                if(field.isAnnotationPresent(MyResource.class)){
                    String packageName = field.getAnnotation(MyResource.class).packageName();
                    Class<?> clazz = Class.forName(packageName);

                    Executant executant = (Executant)clazz.newInstance();

                    field.setAccessible(true);
                    field.set(object, executant);

                }
            }

        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

package oldMark7_Anotation_v1;

//ui意识、无限思维-面向对象
public class Notice {

    //将packageName这个参数进行io传递(提示是否要传递,自动延时XX秒,提示是否需要修改配置文件;)良好的interface friend设计
    @MyResource(packageName = "oldMark7_Anotation_v1.Milaoshi")
    public Executant milaoshi ;

    @MyResource(packageName = "oldMark7_Anotation_v1.Helaoshi")
    public Executant helaoshi;

    public void send(){
        this.privateSend();
    }

    private void privateSend(){

        MyResourceExplanationFactoryImpl.createBean(this);
        milaoshi.setName("米老师");
        System.out.println(milaoshi.hashCode());
        System.out.println(milaoshi.toString());
        helaoshi.setName("何老师");
        milaoshi.OpenDoor(helaoshi);
    }

}

四、总结

  • 1.通过一步步的变化更加认识到变化规律的重要性,使其显得行云流水
  • 2.图对代码,代码配合图的方式强化了宏观
  • 3.图中的布局,也是一种宏观的彰显
  • 4.通过刻意练习来刻画自身通过规律提升想象力的能力

五、升华

本次变化摸索其中的规律,以及结合需求达到每一次变的效果,通过这样的训练可以达到知晓过去通晓未来的神奇。

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

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

相关文章

linux Regmap API

1.针对 I2C 和 SPI 设备寄存器的操作都是通过相关的 API 函数进行操作的。这样 Linux 内核中就会充斥着大量的重复、冗余代码&#xff0c;但是这些本质上都是对寄存器的操作&#xff0c;所以为了方便内核开发人员统一访问I2C/SPI 设备的时候&#xff0c;为此引入了 Regmap 子系…

如何用智能地教狗狗上厕所

背景 22年养了一只很可爱的小狗狗&#xff0c;我其实就一个问题&#xff1a;为啥这么可爱的狗狗会拉屎撒尿呀&#xff1f; 自从崽崽来了我们家之后&#xff0c;最让我们头疼的就是它乱拉、乱尿的问题了&#xff0c;以前会在家里到处乱来&#xff0c;最近一段时间好了很多&…

机器学习(整体结构)

国科大《机器学习》内容&#xff0c;周晓飞老师讲的挺不错的&#xff0c;浅显易懂。 本来是想整理下课程内容的&#xff0c;然而动手后才发现内容过多&#xff08;很想吐槽&#xff0c;为啥这么多模型&#xff1f;不能相互替代么&#xff1f;&#xff09;简略画个思维导图算啦…

探索SpringMVC-HandlerAdapter之RequestMappingHandlerAdapter-返回值处理

前言 上回我们回答了ReqeustMappingHandlerAdapter调用目标方法的参数解析问题&#xff0c;今天我们再来回答第二个问题&#xff1a;怎么处理方法调用的返回值。 深入分析返回值处理需求 RequestMapping处理器的返回值类型 相信很多同学对于这个返回值的第一个反应就是返回一…

图解JDK1.7中HashMap头插法扩容造成的死循环问题

JDK1.7中HashMap头插法扩容造成的死循环问题 文章目录JDK1.7中HashMap头插法扩容造成的死循环问题一、背景二、源码解读三、图解单线程环境中扩容多线程环境中扩容四.总结一、背景 HashMap是线程不安全的&#xff0c;在并发使用HashMap时很容易出现一些问题&#xff0c;其中最…

ArcGIS基础实验操作100例--实验66符号图层的保存与加载

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验66 符号图层的保存与加载 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…

【OpenGL】基础光照

介绍 现实世界中的光照是极其复杂&#xff0c;难以计算的&#xff0c;因此OpenGL的光照使用的是简化的模型&#xff0c;其中一个模型被称为冯氏光照模型(Phong Lighting Model)。 冯氏光照模型的主要结构由三个分量组成&#xff1a; 环境(Ambient)光照漫反射(Diffuse)光照镜…

blender学习笔记2023.01.05

文章目录why基操why 想画条大黄鱼 想画一下渔网 网箱 写笔记预防忘记 基操 1.语言改为中文 不过后续可能改回英文去 2.顶部导航栏—编辑—偏好设置—界面—翻译—&#xff08;关掉&#xff09;新建数据 目的是预防插件导致奇奇怪怪的报错 这里左下角位置处点击 保存修改 3…

初识LCD1602及编程实现字符显示

一、LCD1602基础知识及接线方法LCD1602是一种工业字符型液晶&#xff0c;能够同时显示16x02即32字符&#xff08;16列两行&#xff09;引脚说明第 1 脚: VSS 为电源地 第 2 脚: VDD 接 5V 正电源 第 3 脚: VL 为液晶显示器对比度调整端,接正电源时对比度最弱&#xff0c;接地时…

【Neo4j构建知识图谱】:官方服务图谱大型数据集下载与可视化方法【数据集包括:食谱数据、足球、权力的游戏、美国宇航局、英国公司注册、财产所有权、政治捐款】

目录 1、服务端口免费查看知识图谱2、关于 Neo4j 示例数据集的实现3、下载离线数据集4、项目概览与实现案例还可以看到解析python源码还可以看到解析cypher源码各种数据集实现案例参考1、服务端口免费查看知识图谱 此服务器托管许多具有只读访问权限的数据集,供公众使用。 该…

2022尚硅谷SSM框架跟学(三)MyBatis基础三

2022尚硅谷SSM框架跟学 三 MyBatis基础三9.动态SQL9.1if9.2where方法一:加入恒成立的条件方法二:使用where标签9.3trim9.4choose、when、otherwise9.5foreach9.51批量添加9.52批量删除批量删除方式1批量删除方式2批量删除方式39.6SQL片段10.MyBatis的缓存10.1MyBatis的一级缓存…

JS基础(一)——认识JS及其基础语法

网页的三个组成部分 HTML&#xff1a;用于控制网页的内容CSS&#xff1a;用于控制网页的样式JavaScript&#xff1a;用于控制网页的行为 网页的行为指用户与浏览器的行为交互、浏览器与浏览器与服务器的数据交互。 ECMAScriptS&#xff08;ES&#xff09; ECMAScriptS是Java…

OpenCV入门

OpenCV入门图像金字塔高斯金字塔(cv2.pyrUp、cv.pyrDown)拉普拉斯金字塔边缘检测图像轮廓 (cv2.findContours)轮廓特征&#xff08;cv2.contourArea、cv2.arcLength&#xff09;轮廓近似(cv2.approxPolyDP)边界矩形、外接圆(cv2.boundingRect、cv2.minEnclosingCircle)模板匹配…

C库函数:time.h

time.h C 标准库 – <time.h> | 菜鸟教程 (runoob.com) 库变量 下面是头文件 time.h 中定义的变量类型&#xff1a; 序号变量 & 描述1size_t 是无符号整数类型&#xff0c;它是 sizeof 关键字的结果。2clock_t 这是一个适合存储处理器时间的类型。3time_t is 这是一…

C库函数:math.h

math.h C 标准库 – <math.h> | 菜鸟教程 (runoob.com) 16double pow(double x, double y) 返回 x 的 y 次幂。17double sqrt(double x) 返回 x 的平方根。18double ceil(double x) 返回大于或等于 x 的最小的整数值。19double fabs(double x) 返回 x 的绝对值。20doubl…

矩阵分析:QR分解

Householder变换 Householder变换是一种简洁而有意思的线性变换&#xff0c;也可称为镜面反射变换&#xff0c;Householder变换矩阵为HI−wTwHI-w^TwHI−wTw 考虑向量α\alphaα和一个单位向量w:wTw1w:w^{T}w1w:wTw1 α\alphaα在www 方向上的分量是 αw//(wTα)wwwTα\alpha _…

Python快速制作自动填写脚本:100%准确率

嗨害大家好鸭&#xff01;我是小熊猫~ 环境使用 Python 3.8Pycharm 模块使用 import requests —> 数据请求模块 pip install requestsimport parsel —> 数据解析模块 pip install parselfrom selenium import webdriver —> 自动测试模块 pip install selenium3.…

#H. Linear Approximation

Description给你一个数列A&#xff0c;希望你找出一个数字B。使得下面这个式子的值最小Abs(A1-(B1))Abs(A2-(B2))Abs(A3-(B3))..........Abs(An-(Bn))FormatInput第一行给出输入n第二行给出数列A,数字的值在[1,1e9]N<2e5Output如题Samples输入数据 152 2 3 5 5输出数据 12思…

WQS二分

本博客以一种较为少见的方式来解释WQS二分。 题目 首先&#xff0c;WQS二分用于解决什么问题&#xff1f; 我们先看一个伞兵题目&#xff1a; 有一个 nnn 个数的数组 aaa。 求在 aaa 中恰好选择 mmm 个数的情况下&#xff0c;选择的数的和的最大值。 你现在看到了这个题目&a…

Jenkins基于Blue Ocean UI构建流水线

目录 一、Blue Ocean 简介 二、Blue Ocean 安装 2.1 安装 Blue Ocean 插件 2.2 安装 Blue Ocean 版本的 Jenkins 3. 构建流水线 4. 创建流水线 5. 选择代码仓库 6. 连接Git仓库 7. 创建流水线 详细信息可以参考官网&#xff1a;Blue Ocean 入门 一、Blue Ocean 简介…