day40 设计模式、jdk8新特性

一、代理模式

为其他对象提供一种代理控制此对象的访问

若一个对象不适合直接引用另一个对象,

代理对象在客户端和目标对象之间起到中介作用

组成:

抽象角色:通过接口 抽象类 真实角色实现了哪些方法

代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法

可以附加自己的操作

真实角色:实现抽象角色,定义业务逻辑,供代理角色来调用

  1. 代理模式分类

    • 静态代理

    • 动态代理

      • JDK动态代理

      • cglib动态代理

  2. 静态代理: 抽象角色固定, 代理角色和代理的真实角色是固定。

  3. 动态代理

    通过反射机制来实现的,代理角色不在是固定的角色,而是一个通用的工具类,还可以代理很多操作

动态代理是在静态代理的基础上,代理的真实角色由设置好的固定的一个变成自由的多个,实现更广泛的应用。

动态代理的代理角色类Proxyutil需要实现接口InvocationHandler

public class ProxyUtil经纪人 implements InvocationHandler {private Object obj;public Object newProxyInstance(Object obj){this.obj = obj;return Proxy.newProxyInstance(this.obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);};@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {return method.invoke(obj,args);}
}

/**
 * 代理角色:
 */
public class 经纪人 implements InvocationHandler {
    //真实角色,由于任何角色都可以使用此工具类,所以将真实角色定义成Object
    private Object obj;

    /**
     * 功能:创建真实角色,通过调用方法,获取代理角色代理的对象
     * @return
     */
    public Object newProxyInstance(Object obj){
        this.obj = obj;
        /*
            Proxy这个类是用于设置代理
             newProxyInstance(
                              ClassLoader loader, 参数1:类的加载器
                              Class<?>[] interfaces, 参数2.类的接口
                              InvocationHandler h)  参数3: 本类的实例

          通过 newProxyInstance方法获取真实对象的接口,从而创建代理实例

         */
        Object o = Proxy.newProxyInstance(
                this.obj.getClass().getClassLoader(), //我是谁?  真实对象
                obj.getClass().getInterfaces(), //我干爹是谁? 真实对象实现的接口
                this // 代理是谁, 你要实现哪个接口
        );
        return o;
    }

    //用反射的方法调用真实角色中的方法

    /**
     *
     * @param proxy 代理对象
     * @param method 代理有哪些方法
     * @param args 包含传入代理实例上方法调用的参数值的对象数组
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(obj,args);
    }
}

 经纪公司 经纪公司 = new 经纪公司() {@Overridepublic void 吃饭() {}@Overridepublic void 跳舞() {}@Overridepublic void 唱歌() {}};

代理类实现了所代理的接口,可以在调用代理类方法时调用被代理的对象实现的方法。因此,当使用动态代理时,需要将代理对象转换为被代理对象的接口类型。

二、原型模式

原型模式用于创建重复对象 保证性能  这种类型的设计属于创建创建型模式

方式是有一个原型接口

父类实现Cloneable接口 

  @Overrideprotected Object clone()  {Object clone = null;try {clone = super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return clone;}

三、JDK8新特性

支持Lambda表达式:是一种特殊的匿名内部类形式,语法更加简洁

允许把函数作为一个方法的参数,将代码像数据一样进行传递

基本语法:

函数式接口 变量名 =  (参数,参数)—> {方法体}

注意事项:

形参列表数据类型会自动推断

如果形参列表为空,只需要保留()

如果形参只有一个,()可以省略,只需要参数名即可

如果执行的代码只有一句话且无返回值 { }可省略,

Lambda不会生成一个单独的内部类文件

四、函数式接口

如果一个接口只有  **一**个 抽象方法 该接口称之为函数式接口

函数式接口可以使用Lambda,lambda表达式会自动匹配到这个抽象方法上

@FunctionalInterface

常见的函数式接口:

Consumer消费型接口

Supplier供给型接口

Function函数型接口

Predicate 断言型接口

五、方法引用

方法应用是Lambda表达式的一种简写形式。如果lambda表达式只是调用类已经存在的方法、

对象::实例方法

 类::静态方法

类::实例方法

类::new

  //1. 对象::实例方法Consumer<String> con = s -> System.out.println(s);con.accept("Hello");Consumer<String> con2 = System.out::println;con2.accept("World");//2. 类::静态方法/***  static int compare(int x, int y)* 比较两个 int数字值。*/// Comparator<Integer> com = (o1,o2)->Integer.compare(o2,o1);Comparator<Integer> com2 = Integer::compare;Set<Integer> set = new TreeSet<>(com2);set.add(1);set.add(2);set.add(3);set.add(4);set.add(5);set.add(6);set.add(7);System.out.println(set);// 类::实例方法Function<Student,String> fun = s -> s.getName();Function<Student,String> fun2 = Student::getName;//类::newSupplier<Student> sup = () ->new Student();Supplier<Student> sup2 = Student::new;Student student = sup2.get();System.out.println(student);List<String> list = new ArrayList<>();list.add("宋江");list.add("卢俊义");list.add("公孙胜");list.add("吴用");list.add("关胜");list.add("林冲");//list.forEach(s-> System.out.println(s));list.forEach(System.out::println);}
}

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

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

相关文章

k8s集群中部署服务之部署描述文件准备

微服务部署描述文件Deploy.yaml 一、各微服务创建部署描述文件 1.1 mall-auth-server --- apiVersion: apps/v1 kind: Deployment metadata:name: mall-auth-servernamespace: sangomalllabels:app: mall-auth-server spec:replicas: 1selector:matchLabels:app: mall-auth-s…

Python用若干列的数据多条件筛选、去除Excel数据并批量绘制直方图

本文介绍基于Python&#xff0c;读取Excel数据&#xff0c;以一列数据的值为标准&#xff0c;对这一列数据处于指定范围的所有行&#xff0c;再用其他几列数据数值&#xff0c;加以筛选与剔除&#xff1b;同时&#xff0c;对筛选与剔除前、后的数据分别绘制若干直方图&#xff…

设置伙伴(buddy)-给窗口控件增加快捷键

在官方教程或者很多qt程序中经常看到能使用全键盘操作软件&#xff0c;那么QT creator也支持了这一特性&#xff0c;就是使用设置伙伴来实现的。 我们可以在设计界面按照如下几步实现&#xff1a; 先放置label 再放置一个lineEdit控件。 这个时候我们就可以开始伙伴绑定的步骤…

JVM 虚拟机 ----> Java 类加载机制

文章目录 JVM 虚拟机 ----> Java 类加载机制一、概述二、类的生命周期1、类加载过程&#xff08;Loading&#xff09;&#xff08;1&#xff09;加载&#xff08;2&#xff09;验证&#xff08;3&#xff09;准备&#xff08;4&#xff09;解析&#xff08;5&#xff09;初始…

Spring Boot - Junit4 / Junit5 / Spring Boot / IDEA 关系梳理

文章目录 PreJunit4 / Junit5 / Spring Boot / IDEAIDEA版本Spring-Boot-Older-Release-NotesSpringBootTest 起源 & Spring-Boot-1.4-Release-Notes2.0.0.RELEASE ----- 2.0.9.RELEASE2.1.0.RELEASE ----- 2.1.18.RELEASE2.2.0.RELEASE ~ 2.2.13.RELEASE2.3.0.RELEASE ~ 2…

Docker概念通讲

目录 什么是Docker&#xff1f; Docker的应用场景有哪些&#xff1f; Docker的优点有哪些&#xff1f; Docker与虚拟机的区别是什么&#xff1f; Docker的三大核心是什么&#xff1f; 如何快速安装Docker&#xff1f; 如何修改Docker的存储位置&#xff1f; Docker镜像常…

ARM Linux DIY(十一)板子名称、开机 logo、LCD 控制台、console 免登录、命令提示符、文件系统大小

文章目录 前言板子名称uboot Modelkernel 欢迎词、主机名 开机 logoLCD 控制台console 免登录命令提示符文件系统大小 前言 经过前面十篇文章的介绍&#xff0c;硬件部分调试基本完毕&#xff0c;接下来的文章开始介绍软件的个性化开发。 板子名称 uboot Model 既然是自己的…

ueditor百度富文本编辑器粘贴后html丢失class和style样式

问题 项目经理从123在线编辑上排版好的文章&#xff0c;粘贴到项目的编辑器上&#xff0c;样式完全乱了, 排版是这样的&#xff1a; 复制到ueditor后的格式&#xff1a; 这天差地别呀&#xff0c;于是打开代码模式&#xff0c;发现section的属性全没了 但是&#xff0c;sp…

macOS 12 Monterey:一次全新的跨设备协作体验

macOS 12 Monterey是苹果公司的一次重大突破&#xff0c;它打破了设备间的壁垒&#xff0c;将不同设备无缝地连接在一起&#xff0c;极大地提升了用户的工作效率和娱乐体验。Monterey带来了通用控制、AirPlay、捷径等新功能&#xff0c;以及一些实用的新小功能。 安装&#xf…

vue前后端分离单点登录,结合长token和短token进行登录

单点登录背景 在公司发展初期&#xff0c;公司拥有的系统不多&#xff0c;通常一个两个&#xff0c;每个系统都有自己的登录模块&#xff0c;运营人员每天用自己的账号登陆&#xff0c;很方便&#xff0c;但是&#xff0c;随着企业的发展&#xff0c;用到的系统随之增加&#x…

软件设计模式系列之五——建造者模式

1 模式的定义 建造者模式是一种对象创建型设计模式&#xff0c;它将一个复杂对象的构建过程与其表示分离。这意味着你可以使用相同的构建过程来创建不同类型的对象&#xff0c;而不必关心每个对象的内部细节。这种模式适用于构建具有复杂配置的对象&#xff0c;例如具有多个可…

Linux:LVS (NAT群集搭建)

模拟环境 外网入口服务器 外网 192.168.8.88 内网ip 192.168.254.4 web1 服务器 ip 192.168.254.1 网关&#xff1a; 192.168.254.4 web2 服务器 ip 192.168.254.2 网关&#xff1a; 192.168.254.4 共享存储服务器 ip 192.168.254.3 介绍 访问 外网192.16…

Python编程指南:利用HTTP和HTTPS适配器实现智能路由

嗨&#xff0c;爬虫大佬们&#xff01;今天我要为大家分享一篇关于如何利用HTTP和HTTPS适配器来实现智能路由的Python编程指南。在现代互联网应用中&#xff0c;路由功能起着至关重要的作用&#xff0c;而利用Python编程语言实现智能路由则可以为我们的应用带来更高的灵活性和性…

Window 平台开发基础(一)SDK

基本概念 什么是 SDK SDK 是软件开发工具包&#xff08;Software Development Kit&#xff09;的缩写。它是一个集成了软件开发所需工具、库文件、示例代码和文档等资源的软件包。 SDK 通常由软件开发公司或平台提供&#xff0c;旨在帮助开发人员构建、测试和部署特定类型的…

IAM、EIAM、CIAM、RAM、IDaaS 都是什么?

后端程序员在做 ToB 产品或者后台系统时&#xff0c;都不可避免的会遇到账号系统、登录系统、权限系统、日志系统等这些核心功能。这些功能一般都是以 SSO 系统、RBAC 权限管理系统等方式命名&#xff0c;但这些系统合起来有一个专有名词&#xff1a;IAM。 IAM IAM 是 Identi…

一线大厂Redis高并发缓存架构实战与性能优化

多级缓存架构 缓存设计 缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c; 缓存层和存储层都不会命中&#xff0c; 通常出于容错的考虑&#xff0c; 如果从存储层查不到数据则不写入缓存层。 缓存穿透将导致不存在的数据每次请求都要到存储层去查询&#xff0c; 失…

9.14 C++作业

仿照vector手动实现自己的myVector&#xff0c;最主要实现二倍扩容功能 #include <iostream>using namespace std;template <typename T> class Myvector {T *data; //存储数据的数组int len; //当前数组的长度int mycapa; //容纳数据的总容量public://…

Ubuntu下Nginx配置ModSecurity详细思路及过程

下面是一个简介&#xff1a; Ubuntu是一个linux操作系统&#xff0c;Nginx是一个web服务器软件&#xff0c;ModSecurity是一款开源的web应用防火墙&#xff08;江湖人称“WAF”&#xff09;。 如果上面的概念没有一定的了解&#xff0c;下面的内容其实也能看。就是不好操作。…

浅谈C++|模板篇

一.模板模板概念 模板就是建立通用的模具&#xff0c;大大提高复用性 模板的特点&#xff1a; 1.模板不可以直接使用&#xff0c;它只是一个框架 2.模板的通用并不是万能的 C另一种编程思想称为泛型编程&#xff0c;主要利用的技术就是模板。 C提供两种模板机制:函数模板和类模…

宋浩概率论笔记(八)假设检验

宋浩系列全系列的最后一更&#xff01; 本章考察频率很低&#xff0c;核心在于记忆检验不同参数时用到的分布~