设计模式-代理模式 /动态代理
创始人
2025-05-28 04:51:28
0

proxy模式的核心

proxy是代理人的意思,编程当中,指的是创建代理人和本人两个对象,只有代理人无法完成的工作才会交给本人完成。其他工作都由代理人自己完成。

Proxy模式中的登场角色

subject(主体)

subject角色定义了Proxy角色(代理人)和RealSubject角色(一致)接口。由于存在Subject接口(Proxy、RealSubject都为Subject接口的实现类),所以客户端角色不必在意使用的是proxy角色还是RealSubject角色。

public interface Printable {public abstract void setPrinterName(String name);public abstract String getPrinterName();public abstract void print(String printString);
}

proxy(代理人)

proxy角色会尽量处理来自client角色的请求,只有当自己不能处理时,她才会将工作交给RealSubject角色。Proxy角色只有在必要时才会生成RealSubject角色。Proxy为Subject接口的实现类。

public class PrinterProxy implements Printable {private String printerName;// 被代理对象 Printerprivate Printer printer;public PrinterProxy() {}public PrinterProxy(String printerName) {this.printerName = printerName;}@Overridepublic synchronized void setPrinterName(String name) {if (printer != null) {printer.setPrinterName(name);}printerName = name;}@Overridepublic String getPrinterName() {return printerName;}@Overridepublic void print(String printString) {realize();printer.print(printString);}private synchronized void realize() {if (printer == null) {printer = new Printer();printer.setPrinterName(printerName);}}
}

RealSubject(实际的主体)

RealSubject为Subject接口的实现类。只有Proxy处理不了任务时实现。
实际主体即printer在实例时需要比较长的时间,因此仅需要进行实例化的时候才对其进行实例化。即仅需要使用print功能的时候,才实例化printer。

public class Printer implements Printable {private static final String TAG = "JJWorld Printer";private String name;public Printer() {heavyJob( "printer实例生成中");}public Printer(String name) {this.name = name;heavyJob(name + "的printer实例生成中");}@Overridepublic void setPrinterName(String name) {this.name = name;}@Overridepublic String getPrinterName() {return name;}@Overridepublic void print(String printString) {Log.i(TAG,"************"  + name + "************");Log.i(TAG,"************" + printString + "************");}private void heavyJob(String msg){Log.i(TAG,msg);for (int i = 0; i < 5; i++) {try {Thread.sleep(1000);}catch (Exception e){}Log.i(TAG,".");}Log.i(TAG,"******************end******************");}
}

client(实际的主体)

使用Proxy模式的角色。并不包含在Proxy中。

public class MainActivity extends Activity {private static final String TAG = "JJWorld MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new Thread(new Runnable() {@Overridepublic void run() {Printable printer = new PrinterProxy();printer.setPrinterName("虚空大帝");Log.i(TAG,printer.getPrinterName());printer.print("虚空一生不弱于人");printer.setPrinterName("无始大帝");Log.i(TAG,printer.getPrinterName());}}).start();}
}

静态代理

程序执行之前编写好执行类的代理类。

动态代理

在程序执行过程中,使用jdk的反射机制,创建代理类对象,并动态的制定要代理目标类。

通过反射自动生成代理对象。

案例1

通过重写invoke方法,当targetObj的方法执行前后,执行

Log.i(TAG,"开始执行");
Log.i(TAG,"结束执行");

打印日志操作。

代理类

public class DynamicProxy implements InvocationHandler {private static final String TAG = "JJWorld.DynamicProxy";private Object targetObj;@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Log.i(TAG,"开始执行");Object invoke = method.invoke(targetObj,args);Log.i(TAG,"结束执行");return invoke;}/*** 动态代理对象实例*/public Object getInstance(Object targetObj){this.targetObj = targetObj;return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(),targetObj.getClass().getInterfaces(),this);}}

使用类

public class MainActivity extends Activity {private static final String TAG = "JJWorld MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new Thread(new Runnable() {@Overridepublic void run() {List dynamicProxyList = (List)new DynamicProxy().getInstance(new ArrayList());dynamicProxyList.add("hello world");}}).start();}
}

输出结果

可见,在add方法的前后都加上了打印日志操作

2023-03-14 11:03:43.456 32540-332/cn.jj.project2 I/JJWorld.DynamicProxy: 开始执行
2023-03-14 11:03:43.456 32540-332/cn.jj.project2 I/JJWorld.DynamicProxy: 结束执行

相关内容

热门资讯

国产电脑板安卓系统,引领智能办... 你有没有想过,家里的电脑板竟然也能用安卓系统?没错,就是那个我们平时手机上用的安卓系统,现在竟然也能...
安卓系统怎么调ins,实际应用... 你有没有发现,Instagram(简称ins)这个社交平台简直是个宝藏,各种美图、短视频,还有各种有...
手机安卓系统耗电好快,揭秘安卓... 亲爱的手机控们,你们是不是也有这样的烦恼:手机安卓系统耗电好快,仿佛电量就像流水一样哗啦啦地溜走?别...
安卓系统能定位软件,探索安卓系... 你有没有想过,你的手机里那些神奇的软件是怎么知道你在哪儿的呢?没错,就是安卓系统能定位软件的功劳!今...
安卓系统参数测试软件,基于安卓... 你有没有想过,你的安卓手机里那些神秘的系统参数,其实就像是一扇通往手机性能深处的窗户呢?想要了解这扇...
透明蓝牙耳机安卓系统,智能生活... 你有没有想过,在这个科技飞速发展的时代,拥有一副好耳机是多么重要的一件事呢?想象当你沉浸在美妙的音乐...
微软10系统安装安卓,跨平台体... 亲爱的读者们,你是否曾想过在Windows 10系统上安装安卓系统呢?想象一边享受着Windows的...
ios跟安卓系统混合,打造跨平... 你有没有发现,现在手机的世界里,iOS和安卓就像是两个截然不同的王国,各自有着忠实的粉丝。但你知道吗...
安卓如何系统如何降级,还原至旧... 你有没有想过,你的安卓手机突然间变得卡顿不堪,性能大不如前?别急,今天就来教你怎么给安卓系统来个“时...
中兴不能用安卓系统,探索自主操... 你知道吗?最近有个大新闻在科技圈里炸开了锅,那就是咱们的国产手机品牌中兴,竟然不能用安卓系统了!这可...
安卓系统取消深色模式,探索新功... 你知道吗?最近安卓系统来了一次大变动,那就是取消了深色模式!这可让不少手机用户感到有点懵圈。咱们一起...
安卓模拟苹果系统游戏,畅玩经典... 你有没有想过,在安卓手机上也能玩到那些只在苹果系统上才能体验的游戏呢?没错,就是那种画面精美、操作流...
安卓系统澳门电召,安卓系统下的... 你有没有想过,在繁忙的都市生活中,如何轻松地叫到一辆车呢?现在,就让我带你走进安卓系统澳门电召的世界...
安卓系统的字母代表,字母背后的... 你知道吗?在我们每天使用的安卓手机里,那些看似普通的字母组合,其实有着它们独特的含义和故事呢!今天,...
安卓如何转iphone系统,系... 你有没有想过,从安卓转到iPhone系统,就像是从一个熟悉的老朋友跳到一个全新的世界呢?想象你手中的...
安卓攻略系统变美文,轻松打造完... 亲爱的安卓用户们,是不是觉得手机界面越来越单调,想要给它来个华丽变身呢?别急,今天就来给你支几招,让...
小米9系统安卓多少,基于安卓1... 亲爱的读者们,你是否也像我一样,对手机系统充满了好奇?今天,我们就来聊聊小米9这款手机的系统,看看它...
安卓系统与骁龙系统区别,深度解... 你有没有想过,为什么你的手机里装的是安卓系统,而朋友的手机里却是骁龙系统呢?这两种听起来有点像亲戚的...
安卓刷winphone系统6,... 你有没有想过,如果你的安卓手机突然变成了Windows Phone 6呢?想象那会是怎样一番景象?今...
锤子安卓12系统更新,畅享智能... 你知道吗?最近锤子手机的用户们可是炸开了锅,因为锤子科技终于发布了安卓12系统的更新!这不仅仅是一个...