1.类和对象(实例)的关系

类就是对象的抽象(模板),对象就是类的实例

2.java设置模式--代理模式

定义:代理就是中介,例如租房子经常有中介,还有出票软件 飞猪,携程。

3.代理大纲分为两种:静态代理与动态代理,主要区别在于代理对象是自定义还是系统生成。自定义的为静态代理,自动生成的为动态代理

4.静态代理--举一个我们生活中买房子的事情中介事情

package jav.com.study.proxy.staticProxy;
//这是我们生活中买房子的事情中介事情
public interface SellHome {
public void sell();
}

  

package jav.com.study.proxy.staticProxy;
//这是目标类--房子开发商
public class Developer implements SellHome {
@Override
public void sell() {
System.out.println("这是开发商建造后需要销售的房子");
}
}
package jav.com.study.proxy.staticProxy;
//这是代理,即为中介
public class Medium implements SellHome{ SellHome sellHome;
Medium(SellHome sellHome){
this.sellHome=sellHome;
} @Override
public void sell() {
System.out.println("买房子前咨询一下");
System.out.println("买房子前参观");
System.out.println("买房子签合同");
sellHome.sell();
System.out.println("买房子付款");
}
}

  

以上有我们生活中的行为类(接口),还有目标类(开发商的房子售卖的事情),中介,现在做一下用户测试

package jav.com.study.proxy.staticProxy;

public class Client {
public static void main(String[] args) {
//创建中介,传入target
SellHome sellHome=new Medium(new Developer());
sellHome.sell();
}
}

  

Connected to the target VM, address: '127.0.0.1:54952', transport: 'socket'
Disconnected from the target VM, address: '127.0.0.1:54952', transport: 'socket'
买房子前咨询一下
买房子前参观
买房子签合同
这是开发商建造后需要销售的房子
买房子付款 Process finished with exit code 0

静态代理比较容易理解,简单理解就是,中介拿到了目标类的对象,然后在目标对象的前后做手脚

5.动态代理 --有JDK动态代理,CGLib动态代理等,我们就讲JDK动态代理---还是买房子这件事情

首先不变的有两个类--- 开发商目标类Developer,还有我们买房子这件事 SellHome

然后先跟大家隆重介绍两个新角色 ,不然都不敢说自己是动态代理了,不然怎么和静态代理区别呢

(1)InvocationHandler 这是一个处理器,主要就是每次要执行目标方法的时候,都会跑到InvocationHandler里面的invoke方法(到现在我都不知道底层是怎么实现的,不过我猜测可能是对目标类的各种方法做了listener监听)

(2)Proxy类,刚刚我们说动态代理的代理对象是系统生成的,其实就是Proxy这个大佬生成的

有这两个角色,我们接着讲,我们还得创建一个实现InvocationHandler接口的实现类,创建的时候,把目标对象传给SellHandler,他就像会对目标对象盯得紧紧的

package jav.com.study.proxy.dynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class SellHandler implements InvocationHandler {
Object target; SellHandler(Object o){
this.target=o;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("买房子前咨询一下");
System.out.println("买房子前参观");
System.out.println("买房子签合同");
method.invoke(this.target,args);
System.out.println("买房子付款");
return null;
}
}

  

其次创建Client,我们来看一下

package jav.com.study.proxy.dynamicProxy;

import java.lang.reflect.Proxy;

public class Client {
public static void main(String[] args) {
//第一步创建目标类
SellHome sellHome=new Developer();
//第二步创建控制类
SellHandler sellHandler=new SellHandler(sellHome);
//第三步创建代理对象
SellHome proxy= (SellHome) Proxy.newProxyInstance(sellHome.getClass().getClassLoader(),
sellHome.getClass().getInterfaces(),sellHandler);
//第四步骤代理类调用目标类方法
proxy.sell();
}
}

  

Connected to the target VM, address: '127.0.0.1:56137', transport: 'socket'
Disconnected from the target VM, address: '127.0.0.1:56137', transport: 'socket'
买房子前咨询一下
买房子前参观
买房子签合同
这是开发商建造后需要销售的房子
买房子付款 Process finished with exit code 0

 效果是一样的

动态代理肯定是比静态代理好,少写很多代码,统一处理

---今天20200504

研究了一下cglib动态代理

这个比jdk动态代理更强大--不分是否有接口

就是给我们的目标类创建一个代理类,那么我们得有目标类,即如下

// 目标类
public class CglibClass {
public final void testHideFinal(){
System.out.println("这是不能展示的");
}
public void testShowFinal(){
System.out.println("这是可以展示的");
}
}

 还有生成代理类的类,我们就叫代理工厂吧

//代理工厂
public class CGLibProxy implements MethodInterceptor {
Object o; public Object createProxyObject(Object obj){
this.o=obj;
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(obj.getClass());
enhancer.setCallback(this);
Object newProxy=enhancer.create();
return newProxy;
}
@Override
public Object intercept(Object p, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("开始进行权限检测");
Object ret=method.invoke(o,objects);
System.out.println("检测完毕");
return ret;
}
}

-- 接下来测试

public class ProxyTest {
public static void main(String[] args) {
CGLibProxy cgLibProxy=new CGLibProxy();
CglibClass cglibClass= (CglibClass) cgLibProxy.createProxyObject(new CglibClass());
cglibClass.testHideFinal();
cglibClass.testShowFinal();
}
}

 -- 输出

这是不能展示的
开始进行权限检测
这是可以展示的
检测完毕 Process finished with exit code 0

  

 注意:这里为什么testHideFinal()前后没有进行权限检测呢?这是因为使用了final的方法,使得新创建的代理类不能够继承,所以就没有前后输出检测的信息

---今天是2019.10.15 我温故一下

二.工厂方法模式

工厂方法主要是吧对象的生产和使用分离开,主要涉及的类有四个,抽象工厂,具体工厂,抽象产品,具体产品(参考出自http://c.biancheng.net/view/1348.html)

具体代码:

创建一个接口 Product

class Interface Product{
public void show();
}

然后创建实现类

class Product1 implement Product{
public void show{
System.out.print("这是产品1");
}
} class Product2 implement Product{
public void show{
System.out.print("这是产品2");
}
}

创建抽象工厂

Class Interface ProductFactory{
public Product getProduct();
}

创建抽象工厂实现类

Class ProductFactory1 implement ProductFactory{
public Product getProduct(){
System.out.print("工厂1->创建产品1");
}
} Class ProductFactory2 implement ProductFactory{
public Product getProduct(){
System.out.print("工厂2->创建产品2");
}
}

最后写测试

Class ClientTest{
public static void main(String[] args){
//获取配置信息,具体可以自己写一个
ProductFactory pf=(ProductFactory) ReadXML1.getObject();
Product p=pf.getProduct();
p.show();
}
}

三.抽象工厂模式

比较工厂模式,竖向多了一个产品等级

java基础-温故而知新的更多相关文章

  1. java基础--温故而知新 (01)

    1 myeclipse是一个eclipse插件.使用java语言开发.进程是javaw.exe--非命令行方式启动.   2 考这些术语的公司,往往都是世界一流的好公司.(技术广度+英语) java ...

  2. java基础-温故而知新(02)

    基本数据的自动拆装箱及享元设计模式 1.1 自动装箱        -128~127 之间的整数,装在一个内存区域.         超过这个范围的整数,装在不同的内存区域. 1.2 自动拆箱     ...

  3. java基础练习 字符串,控制流,日历,日期等

    1,对基本控制流程的一些练习 package org.base.practice3; import org.junit.Test; /** * Created with IntelliJ IDEA. ...

  4. Java基础——自己的总结

    Java Java是什么? Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Java语言作 ...

  5. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  6. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  7. 【JAVA面试题系列一】面试题总汇--JAVA基础部分

    JAVA基础 基础部分的顺序: 基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 每天几道,持续更新!! 1.一个". ...

  8. 最适合作为Java基础面试题之Singleton模式

    看似只是最简单的一种设计模式,可细细挖掘,static.synchronized.volatile关键字.内部类.对象克隆.序列化.枚举类型.反射和类加载机制等基础却又不易理解透彻的Java知识纷纷呼 ...

  9. Java基础知识【下】( 转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608360 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

随机推荐

  1. 【题解】NOIP2016提高组 复赛

    [题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ...

  2. java架构之路-(tomcat网络模型)简单聊聊tomcat(一)

    tomcat使我们熟知的也是我们使用最多的web服务器了,至少我是使用最多的.常见的web服务器还有Apache,web logic,JBOSS等,对于tomcat的安装我就不再赘述了,简单的不能再简 ...

  3. WEB网站发布服务器IIS报错问题终极解决方案,查到问题点

    4本次错误webservice发布新服务器后,出现此错误. 解决方法: 找到dmp文件 dmp文件是啥?自己百度.简单的说就是黑匣子,记录程序崩溃前的操作,那么如何找到这个黑匣子呢? 1.启动 Win ...

  4. PHP 日历函数手册

    PHP日历函数安装>>> 函数名称 描述 cal_days_in_month 返回某个历法中某年中某月的天数 cal_from_jd 转换Julian Day计数到一个支持的历法. ...

  5. 【Qt编程】基于QWT的曲线绘制及图例显示操作——有样点的实现功能

    在<QWT在QtCreator中的安装与使用>一文中,我们完成了QWT的安装,这篇文章我们讲讲基础曲线的绘制功能. 首先,我们新建一个Qt应用程序,然后一路默认即可.这时,你会发现总共有: ...

  6. php报错Array to string conversion 解决方案,动态输出数据库列名称

    php报错Array to string conversion 解决方案,动态输出数据库列名称 问题:在Windows php5.3环境下使用:<?php echo $row->$keys ...

  7. BUUCTF Hack World

    有返回 ,基于布尔得盲注这里用到异或注入(个人喜欢这样用)1^0 返回 Hello, glzjin wants a girlfriend.1^1 返回 Error Occured When Fetch ...

  8. 设置VMware中Kali 共享文件夹

    (软件环境: Vmware Workstation 15.5 Pro , Kali Linux2019.3) 1. VMware设置共享目录 2. 安装VMware-Tools 命令: apt-get ...

  9. Ubuntu安装MDK

    1 环境部署 [x] Ubuntu 18.04 [x] Wine 3.0.4 1.0 查看CPU信息 lscpu 序号 属性 描述 1 架构 x86_64 2 CPU 运行模式 32-bit, 64- ...

  10. linux (01) linux基础

    一.了解linux 都有哪些职位 机房运维 负责服务器的上下架 桌面运维 专业修电脑 修打印机 系统管理员 负责liunux操作系统的维护 运维开发  linux +  python  把平时自己手敲 ...