今天来提一下Java中的设计模式之代理模式。
目的:
对Java的代理设计模式在实际的程序项目中的作用及它的一些方便性进行了解和探索。
技术:
- 代理设计模式
实际操作:
代理模式是Java常见的设计模式之一。所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。
在这里,我们就要想到为什么要在程序中去运用它呢?
- 在某些情况下,因为客户端不想直接访问实际的对象,或者访问实际的对象存在困难,因此通过一个代理对象来完成间接的访问。
这在生活中很常见,如你打官司要请律师,买房要找中介,买车找售车代理商之类的。这些都是你不想亲自动手去解决某件事,去找了一个中间人来帮你代理处理这些事情。代理模式在java中就是起到这样的作用。
16.png
代理模式可以分为静态代理和动态代理两种。
静态代理:用一个Dmeo来展示 一下
创建一个Read类,展示显示的界面
/**
* 阅读界面 展示显示的文本
*/
public class Read {
private String text;
private String color;//默认的颜色
private int size;//默认的字体大小
private String pic;//更改背景图片
//构造方法
public Read(String text) {
this.text = text;
}
//模拟进入设置页面
public void goToSetting(){
//1.创建设置页面的对象
Setting setting=new Setting(this);
//2.进入设置页面
setting.startSetting();
}
//提供给外部一个方法,可以通过这个方法给我传值
public void change (String color,int size, String pic){
System.out.println("改变前的颜色:" + this.color + "大小:" + this.size + "原始图片:" + this.pic);
this.color = color;
this.size = size;
this.pic = pic;
System.out.println("改变后的颜色:" + this.color + "改变后的大小:" + this.size + "更改后的图片" + this.pic);
}
}
定义一个Setting类来接收外部的Read类对象
/**
* 设置页面,设置字体大小和颜色
*/
public class Setting {
//记录下我做完事情之后,将数据返回给谁
Read delegate;//记录为谁设置颜色和大小
ChatSetting r1;
//创建对象的时候,就需要告诉我你是谁
public Setting(Read delegate){
this.delegate=delegate;
}
public Setting(ChatSetting r1){
this.r1=r1;
}
//开始设置
public void startSetting() {
System.out.println("开始设置");
System.out.println("********");
System.out.println("设置完毕,即将返回结果");
//1.如果有可以访问的属性,直接通过属性给值
// (比较少用) 主要是对象没办法第一时间知道自己需要的值有了
/*delegate.color="orange";
delegate.size=18;*/
//2.通过方法来回调
delegate.change("Blue",18);
定义一个Start类来测试
**
* 接口实现回调 代理设计模式
*/
public class Start {
public static void main(String[] args){
Read read=new Read("test");
read.goToSetting()
}
}
运行结果:
17.PNG
动态代理:
public class DynamicProxyHandler implements InvocationHandler {
private Object object;
public DynamicProxyHandler(final Object object) { this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("买房前准备");
Object result = method.invoke(object, args);
System.out.println("买房后装修");
return result;
}
}
public class DynamicProxyTest {
public static void main(String[] args) {
BuyHouse buyHouse = new BuyHouseImpl();
BuyHouse proxyBuyHouse = (BuyHouse) Proxy.newProxyInstance(BuyHouse.class.getClassLoader(), new
Class[]{BuyHouse.class}, new DynamicProxyHandler(buyHouse));
proxyBuyHouse.buyHosue();
}
}
在动态代理中我们不再需要再手动的创建代理类,我们只需要编写一个动态处理器就可以了。真正的代理对象由JDK再运行时为我们动态的来创建。
对于这个代理模式,我自己还是不怎么清楚,还得下去查查和敲敲代码。今天这个总结如果有错,请不要在意啊。