代理模式:
静态代理->将需要代理的类交给代理类处理,代理类做一些自己的业务处理.比如:对接口的调用限制,添加描述等
动态代理->如果代理的是接口的话使用jdk自带的代理。
修饰模式:
对方法的一些描述修饰。
准备接口与类:
/**
* Created by h on 2019/3/14.
*/
public interface Person {
String asy();
String eat();
}
package com.designPattern.pojo;
import com.designPattern.api.Person;
/**
* Created by h on 2019/3/14.
*/
public class ManPerson implements Person,Cloneable{
@Override
public String asy() {
return "男生讲话啦";
}
@Override
public String eat() {
return "男生吃东西啦";
}
/**
* 原型模式
* @return
* @throws CloneNotSupportedException
*/
@Override
public Object clone() throws CloneNotSupportedException {
ManPerson clone = (ManPerson) super.clone();
return clone;
}
}
静态代理实现:
package com.designPattern.service;
import com.designPattern.api.Person;
import com.designPattern.pojo.ManPerson;
/**
* 代理模式-静态代理
* Created by h on 2019/3/18.
*/
public class PersonProxyStatic implements Person {
private Person person;
public PersonProxyStatic(Person person) {
this.person = person;
}
public void before(){
System.out.println("静态代理-before:");
}
public void after(){
System.out.println("静态代理-after:");
}
@Override
public String asy() {
// 装饰模式-装饰接口
before();
String asy = person.asy();
after();
return asy;
}
@Override
public String eat() {
// 装饰模式-装饰接口
before();
String eat = person.eat();
after();
return eat;
}
}
动态代理实现:(不用对每个接口都做相同的操作)
package com.designPattern.service;
import com.designPattern.api.Person;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 代理模式-动态代理
* Created by h on 2019/3/18.
*/
public class PersonProxyDynamic implements InvocationHandler {
private Object object;
public PersonProxyDynamic(Person person) {
this.object = person;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 修饰模式-修饰接口
System.out.println("动态代理-before:");
Object invoke = method.invoke(object, args);
System.out.println("动态代理-after:");
return invoke;
}
}
测试:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/**
* 代理模式and装饰模式
* Created by h on 2019/3/18.
*/
public class ProxyAndModifyTest {
public static void main(String[] args) {
// 动态代理
Person person = new ManPerson();
InvocationHandler handler = new PersonProxyDynamic(person);
Person personProxyDynamic = (Person)Proxy.newProxyInstance(
handler.getClass().getClassLoader(),
person.getClass().getInterfaces(), handler);
System.out.println("动态代理:" + personProxyDynamic.eat());
// 静态代理
PersonProxyStatic personProxyStatic = new PersonProxyStatic(person);
System.out.println("静态代理:" + personProxyStatic.eat());
}
}
打印结果:
动态代理-before:
动态代理-after:
动态代理:男生吃东西啦
静态代理-before:
静态代理-after:
静态代理:男生吃东西啦
若有理解不到位的地方希望大家能够指点一下,也避免让别人犯错。非常感谢!!!