1.使用代理对象,是为了在不修改目标对象的基础上,增强主业务逻辑。客户类真正的想要访问的对象是目标对象,但客户类真正可以访问的对象是代理对象。

2.静态代理是指,代理类在程序运行前就已经定义好,其与目标类的关系在程序运行前就已经确立

3.SomeServiceProxy和SomeServiceImpl都实现ISomeService接口,并且SomeServiceProxy依赖于实现了ISomeService接口的目标类

4.动态代理

JDK的Proxy:

  目标类必须要实现接口

  

        final ISomeService target = new SomeServiceImpl();
ISomeService proxy = (ISomeService) Proxy.newProxyInstance(target
.getClass().getClassLoader(), // 目标类的类加载器
target.getClass().getInterfaces(), // 目标类所实现的所有接口
new InvocationHandler() { // 匿名内部类
// proxy:代理对象
// method:目标方法
// args:目标方法的参数列表
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
// TODO Auto-generated method stub
Object result = method.invoke(target, args);
if(result!=null)
result = ((String) result).toUpperCase();
return result;
}
});
String result = proxy.doFirst();

CGLIB动态代理:

  通过继承实现功能增强,要求目标类能被继承

  采用方法回调设计模式:就是类A调用类B中的某个方法b,然后类B又再某个时候反过来调用类A中的某个方法a,对于A来说,这个a方法便叫做回调方法  

  

package com.travelsky.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy; public class MyCglibFactory implements MethodInterceptor{
private SomeService target; public MyCglibFactory() {
super();
// TODO Auto-generated constructor stub
target=new SomeService();
} public SomeService myCglibCreator(){
//创建增强器对象
Enhancer enhancer = new Enhancer();
//指定目标类,即父类
enhancer.setSuperclass(SomeService.class);
//设置回调接口对象
enhancer.setCallback(this);
return (SomeService) enhancer.create();
} //回调方法
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
// TODO Auto-generated method stub
Object result = method.invoke(target, args);
if(result!=null){
result = ((String)result).toUpperCase();
}
return result;
}
}

5.java命令启动java虚拟机:

1)启动虚拟机:D:\SoftwareInstalled\jdk1.7\jre\bin\server\jvm.dll

2)启动类加载器:Bootstrap ClassLoader:D:\SoftwareInstalled\jdk1.7\jre\lib\rt.jar

3)扩展类加载器:extension ClassLoader:D:\SoftwareInstalled\jdk1.7\jre\lib\ext\*.jar

4)应用程序类加载器:Application ClassLoader:负责加载用户类路径(ClassPath)上所指定的类库。

6.适配器模式

7.模板方法设计模式

在模板方法设计模式中,存在一个父类。其中包含两类方法:模板方法与步骤方法。

模板方法,即实现某种算法的方法步骤和框架,都是通过调用步骤方法完成的。

步骤方法,即完成模板方法的每个阶段性的方法。每个步骤方法完成某一特定的、完成总算法的一部分功能。步骤方法有三种类型:抽象方法、最终方法、与钩子方法

抽象方法是要求子类必须实现的方法,是完成模板方法的算法步骤中必须由子类完成的个性化定义。

最终方法是子类不能重写的方法,是若要完成模板方法的算法步骤,对于所有子类执行都一样的步骤。(用final修饰)

钩子方法是父类给出了默认实现,但子类也可以重写的方法。

SSM前言——相关设计模式的更多相关文章

  1. 浅谈JavaScript原型对象与相关设计模式

    引言 本文先从介绍JavaScript中基本的几种设计模式开始,最后引出原型对象,然后对原型对象有一个较全面的介绍. 1.创建对象的几种设计模式 A.工厂模式 我们知道在JavaScript中创建对象 ...

  2. (六:NIO系列) 相关设计模式

    出处:  反应器模式 vs 观察者模式  反应器模式 vs 生产者消费者模式 反应器模式 vs 观察者模式 反应器模式 是一种为处理服务请求并发提交到一个或者多个服务处理程序的事件设计模式.当请求抵达 ...

  3. Java Web Without SSM(前言)

    是的,Spring,Mybaties确实给我们带来了方便的轻量级JavaWeb开发,但是,对于大部分中小系统来说,分层,框架,规范,已经成为一种累赘.实际的程序开发过程中,大部分时间都花在了" ...

  4. Java SSM 框架相关基础面试题

    一.Spring 面试题 1. Spring 在 SSM 中起什么作用? Spring 是轻量级框架,作用是作为 Bean 工厂,用来管理 Bean 的声明周期和框架集成. Spring 的两大核心: ...

  5. ssm搭建相关的问题

    在搭建ssm框架时候踩得坑:1.对于拦截器url-parttern的设置:第一次设置的是/** 本以为这个是表示拦截所有,没想到这是错误的写法,正确的写法是/    启动项目不会报错,但是会出现404 ...

  6. SSM整合相关试题

    1.下列关于Spring自动装配的说法中,错误的是() A 在Spring配置文件中,可以通过<bean>元素的autowire属性指定自动装配方式 B autowire属性值可以设置为n ...

  7. 转-PHP 设计模式 之策略模式 应用场景 Strategy Pattern

    一.前言 关于设计模式的文章,园子里实在是太多太多,而且讲解的也非常精彩,那为什么我还要在这里记录下这篇文章?本文以实际项目应用“自己动手写工具--XSmartNote”为切入点,来讲述策略模式的应用 ...

  8. C基础 常用设计模式粗解

    引言 面向对象, 设计模式是现代软件开发基石. C的面向过程已经很简洁, 但不代表C就没有面向对象.(libuv框架中C面向对象用的很多) 因为思想是互通的.全当熟悉一下那些常用的设计模式.先假定有一 ...

  9. [Unity 设计模式]IOC依赖倒置

    1.前言 最近在看<游戏开发与设计模式>一书,看到控制反转设计模式,作者说:上层模块不应该依赖于下层模块,上层模块和下层模块都应该依赖于接口,这样能减少耦合.然后附带举了个例子,我觉得特别 ...

随机推荐

  1. JavaScript 字典

    JavaScript 字典 字典以 key value 形式出现 使用: a = {'k1':'v1,''k2':'v2'} 获取值: a['k1'] 获取值:v1

  2. openwrt修改hosts

    不同于标准linux主机,openwrt使用dnsmasq来管理dns和dhcp. 修改dnsmasq的配置文件 vi /etc/config/dhcp 在config dnsmasq这组下面添加 l ...

  3. 自制操作系统Antz(3)——进入保护模式 (中) 直接操作显存

    Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html Linux内核源码分析地址:https://www.cnblogs. ...

  4. CEF 跨域访问iframe

    转载:https://www.cnblogs.com/wxxweb/p/3738696.html 在CefBrowserSettings也就是_cef_browser_settings_t结构体中,有 ...

  5. flask --- 04 . 偏函数, 线程安全,栈堆,

    一.偏函数(partial) ①第一种 结果为: ② 第二种 二.线程安全 将空间转换成时间 问题: 1秒钟打印所有结果 threading.current_thread().ident :线程ID ...

  6. Java自带RPC实现,RMI框架入门

    Java自带RPC实现,RMI框架入门 首先RMI(Remote Method Invocation)是Java特有的一种RPC实现,它能够使部署在不同主机上的Java对象进行通信与方法调用,它是一种 ...

  7. [Hibernate] inner Join和 left Join

    @Test public void test11(){ Session ss=HibernateUtil.getSession(); //根据员工名称(SCOTT)找到和他所在的部门的其他员工的信息 ...

  8. postman管理收藏夹,批量执行接口

    ①创建一个新的收藏夹,在弹出的对话框中输入收藏夹的名称和描述然后点击Create按钮创建 ②保存接口请求到收藏夹或文件夹 注意:表单格式的request和二进制格式的request中包含的文件是不会被 ...

  9. doctrine/annotation 的简单使用

    <?php // 错误处理机制 register_shutdown_function('myShutDown'); set_error_handler('myError'); set_excep ...

  10. 2018普及组摆渡车洛谷5017(dp做法)

    啦啦啦,这一篇是接上一篇的博客,上一篇是记忆化搜索,而这一篇是dp+前缀和小技巧 dp这种玄学做法我这种蒟蒻当然不是自己想出来的,参考https://blog.csdn.net/kkkksc03/ar ...