Subject接口
package 结构;
/**
* @Program: 设计模式
* @Description: Subject类定义了 RealSubject和Proxy的共用接口,
* 这样就能在任何能够使用RealSubject的地方使用Proxy了
* @Author Mokairui
* @Date 2020/12/5 11:46
*/
public interface Subject {
void request();
}
RealSubject具体实现类
package 结构;
/**
* @Program: 设计模式
* @Description: 定义了Proxy所代表的真实实体
* @Author Mokairui
* @Date 2020/12/5 11:48
*/
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("真实的请求");
}
}
代理对象
package 结构;
/**
* @Program: 设计模式
* @Description: 保存一个引用使得代理可以访问实体,并提供一个于Subject的接口相同的接口,
* 这样代理就可以用来替代实体
* @Author Mokairui
* @Date 2020/12/5 11:50
*/
public class Proxy implements Subject {
private RealSubject realSubject;
@Override
public void request() {
if (realSubject == null) {
realSubject = new RealSubject();
}
// 调用方法,但是在这里就可以就可以添加你想要的额外功能等
realSubject.request();
}
}
测试
package 结构;
/**
* @Program: 设计模式
* @Description: 测试类
* @Author Mokairui
* @Date 2020/12/5 12:22
*/
public class Demo {
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.request();
}
}
礼物接口
package example.静态;
/**
* @Program: 设计模式
* @Description: 送礼物的接口
* @Author Mokairui
* @Date 2020/12/5 13:43
*/
public interface IGiveGift {
void GiveDolls();
void GiveFlowers();
void GiveChocolate();
}
被追求者
package example.静态;
/**
* @Program: 设计模式
* @Description: 被追求者
* @Author Mokairui
* @Date 2020/12/5 14:29
*/
public class SchoolGirl {
private String name;
public SchoolGirl() {
}
public SchoolGirl(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
追求者
package example.静态;
/**
* @Program: 设计模式
* @Description: 追求者
* @Author Mokairui
* @Date 2020/12/5 13:44
*/
public class Pursuit implements IGiveGift {
private SchoolGirl schoolGirl;
public void setSchoolGirl(SchoolGirl schoolGirl) {
this.schoolGirl = schoolGirl;
}
@Override
public void GiveDolls() {
System.out.println(schoolGirl.getName() + "送你洋娃娃");
}
@Override
public void GiveFlowers() {
System.out.println(schoolGirl.getName() + "送你鲜花");
}
@Override
public void GiveChocolate() {
System.out.println(schoolGirl.getName() + "送你巧克力");
}
}
代理类
package example.静态;
/**
* @Program: 设计模式
* @Description: 代理类
* @Author Mokairui
* @Date 2020/12/5 14:33
*/
public class Proxy implements IGiveGift {
private Pursuit pursuit;
public void setPursuit(Pursuit pursuit) {
this.pursuit = pursuit;
}
@Override
public void GiveDolls() {
System.out.println("我是代理了送洋娃娃,我可以在这里加额外需求");
pursuit.GiveDolls();
}
@Override
public void GiveFlowers() {
System.out.println("我是代理了送鲜花,我可以在这里加额外需求");
pursuit.GiveFlowers();
}
@Override
public void GiveChocolate() {
System.out.println("我是代理了送巧克力,我可以再这里加额外需求");
pursuit.GiveChocolate();
}
}
测试
package example.静态;
/**
* @Program: 设计模式
* @Description: 测试类
* @Author Mokairui
* @Date 2020/12/5 14:36
*/
public class Demo {
public static void main(String[] args) {
SchoolGirl schoolGirl = new SchoolGirl("yanzi");
Pursuit pursuit = new Pursuit();
pursuit.setSchoolGirl(schoolGirl);
Proxy proxy = new Proxy();
proxy.setPursuit(pursuit);
proxy.GiveDolls();
System.out.println("-----------------");
proxy.GiveFlowers();
System.out.println("------------------");
proxy.GiveChocolate();
}
}
追求者和被追求者,送礼物的接口这里就不重复写了
DynamicProxyHandler类
package example.动态.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @Program: 设计模式
* @Description: 动态代理对象
* @Author Mokairui
* @Date 2020/12/5 13:08
*/
public class DynamicProxyHandler implements InvocationHandler {
private Pursuit pursuit;
public DynamicProxyHandler(Pursuit pursuit) {
this.pursuit = pursuit;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
if ("GiveDolls".equals(method.getName())) {
// 用来区别增强的不同方法
System.out.print("最最可爱的");
}
if ("GiveFlowers".equals(method.getName())) {
// 针对不同的方法,增强不同的内容
System.out.println("五颜六色的哦");
}
result = method.invoke(this.pursuit, args);
return result;
}
}
测试类
package example.动态.jdk;
import java.lang.reflect.Proxy;
/**
* @Program: 设计模式
* @Description: 测试类
* @Author Mokairui
* @Date 2020/12/5 13:11
*/
public class Demo {
public static void main(String[] args) {
Pursuit pursuit = new Pursuit();
pursuit.setSchoolGirl(new SchoolGirl("yanzi"));
IGiveGift proxy = (IGiveGift) Proxy.newProxyInstance(pursuit.getClass().getClassLoader()
, pursuit.getClass().getInterfaces()
, new DynamicProxyHandler(pursuit));
proxy.GiveDolls();
System.out.println("---------------------");
proxy.GiveFlowers();
System.out.println("---------------------");
proxy.GiveChocolate();
}
}
追求者的类,本来是实现接口,这里就变成了一个普通的类
package example.动态.cglib;
/**
* @Program: 设计模式
* @Description:
* @Author Mokairui
* @Date 2020/12/14 22:15
*/
public class Pursuit {
private SchoolGift schoolGift;
public void setSchoolGift(SchoolGift schoolGift) {
this.schoolGift = schoolGift;
}
public void giveDolls() {
System.out.println("追求者送" + schoolGift.getName() + "娃娃");
}
public void giveFlowers() {
System.out.println("追求者送" + schoolGift.getName() + "鲜花");
}
public void giveChocolate() {
System.out.println("追求者送" + schoolGift.getName() + "巧克力");
}
}
代理类
package example.动态.cglib;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* @Program: 设计模式
* @Description:
* @Author Mokairui
* @Date 2020/12/14 22:26
*/
public class DynamicProxyCglibHandler implements MethodInterceptor {
// 需要代理的对象
private Pursuit pursuit;
public DynamicProxyCglibHandler(Pursuit pursuit) {
this.pursuit = pursuit;
}
/**
* 代理的核心方法
* @param proxy
* @param method
* @param args
* @param methodProxy
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
Object obj = null;
System.out.println("代理方法前");
method.invoke(pursuit, args);
System.out.println("代理方法后");
return obj;
}
}
测试类
package example.动态.cglib;
import net.sf.cglib.proxy.Enhancer;
/**
* @Program: 设计模式
* @Description:
* @Author Mokairui
* @Date 2020/12/14 22:10
*/
public class Demo {
public static void main(String[] args) {
SchoolGift schoolGift = new SchoolGift();
schoolGift.setName("燕子");
Pursuit pursuit = new Pursuit();
pursuit.setSchoolGift(schoolGift);
Pursuit proxy = (Pursuit) Enhancer.create(pursuit.getClass(),
new DynamicProxyCglibHandler(pursuit));
proxy.giveDolls();
System.out.println("-----------------");
proxy.giveFlowers();
System.out.println("----------------");
proxy.giveChocolate();
}
}
原文:https://www.cnblogs.com/mokairui/p/14089790.html