Android插件化开发基础之静态代理模式
一 Proxy模式
意图:
为其他对象提供一种代理以控制这个对象的访问。
适用性:
l 远程代理( Remote Proxy ): 为一个对象在不同的地址空间提供局部代表。
l 虚代理(Virtual Proxy)根据需要创建开销很大的对象。使用一个代理对象作为代表,在真正的需要时进行创建。
l 保护代理(Protection Proxy):控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
l 智能指引(Smart Reference): 取代了简单的指针,它在访问对象时执行一些附加操作。对指向实际对象的引用计数,
这样当该对象没有引用时,可以自动释放它,智能指针当第一次引用一个持久对象时,将它装入内存。
在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它
其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。再如我们有的时候打官司,我们需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们的想法。先来看看关系图:
根据上文的阐述,代理模式就比较容易的理解了,我们看下代码:
public interface Sourceable { public void method();
}
public class Source implements Sourceable { @Override public void method() { System.out.println("the original method!"); }
}
public class Proxy implements Sourceable { private Source source; public Proxy(){ super(); this.source = new Source(); } @Override public void method() { before(); source.method(); atfer(); } private void atfer() { System.out.println("after proxy!"); } private void before() { System.out.println("before proxy!"); }
}
public class ProxyTest { public static void main(String[] args) { Sourceable source = new Proxy(); source.method(); } }
输出:
before proxy!
the original method!
after proxy!
代理模式的应用场景:
如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:
1、修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。
2、就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。
使用代理模式,可以将功能划分的更加清晰,有助于后期维护!
Android插件化开发基础之静态代理模式相关推荐
- Android插件化开发基础之Java动态代理(proxy)机制的简单例子
一.代码 package com.sangfor.tree;import java.lang.reflect.InvocationHandler; import java.lang.reflect.M ...
- Android插件化开发基础之Java类加载器与双亲委派模型
类加载器 Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程. 在加载阶段,java虚拟机需 ...
- Android插件化开发基础之App如何动态加载类
在 Java 里面,我们可以把一些类放到 .jar 文件里面,然后用 ClassLoader 动态加载.例如: URLClassLoader ucl = URLClassLoader.newInsta ...
- Android插件化开发基础之Java反射机制研究
一.获得Class对象 Class<?> c = Class.forName("classname"); 抛出ClassNotFoundException 二.获得实现 ...
- Android插件化开发指南——Hook技术(一)【长文】
文章目录 1. 前言 2. 将外部dex加载到宿主app的dexElements中 3. 插件中四大组件的调用思路 4. Hook 2.1 对startActivity进行Hook 2.1.1 AMS ...
- Android插件化开发之解决OpenAtlas组件在宿主的注冊问题
Android插件化开发之解决OpenAtlas组件在宿主的注冊问题 OpenAtlas有一个问题,就是四大组件必须在Manifest文件里进行注冊,那么就必定带来一个问题,插件中的组件都要反复在宿主 ...
- Android插件化开发指南——插件化技术简介
文章目录 1. 为什么需要插件化技术 2. 插件化技术的历史 3. 插件化实现思路 3.1 InfoQ:您在 GMTC 中的议题叫做<Android 插件化:从入门到放弃>,请问这个标题代 ...
- Android插件化开发之动态加载本地皮肤包进行换肤
Android插件化开发之动态加载本地皮肤包进行换肤 前言: 本文主要讲解如何用开源换肤框架 android-skin-loader-lib来实现加载本地皮肤包文件进行换肤,具体可自行参考框架原理进行 ...
- Android插件化开发指南——实践之仿酷狗音乐首页
文章目录 1. 前言 2. 布局分析 3. 底部导航栏的实现 4. 顶部导航栏和ViewPager+Fragment的关联 1. 前言 在Android插件化开发指南--2.15 实现一个音乐播放器A ...
最新文章
- JavaScript 正则表达式的使用
- 64位win10系统无法安装.Net framework3.5的解决方法
- 转:C#使用Log4Net记录日志
- magento更新产品状态报错
- 呆萌直播源码:如何开发视频直播平台?
- 一个亿的融资在一家芯片初创公司可以烧多久?
- 谷歌Gboard输入法新增“无痕模式”:仅在Chrome隐身窗口中适用
- Android Studio之提示Gradle sync failed: Plugin with id ‘com.novoda.bintray-release‘ not found.
- columnproperty server sql_获取SQL Server表字段的各种属性
- 深度 | 从DevOps到BizDevOps, 研发效能提升的系统方法
- docker 容器安装conposer_docker和php:将依赖项(composer)放入容器中
- 【面试收藏】Redis最全面试题
- JAVA中extends 与implements区别
- 大话设计模式读书笔记(十三) 状态模式
- Web自动化测试中的接口测试
- 蓝桥杯 ADV-11 算法提高 Torry的困惑(提高型)
- Java 阻塞队列实现原理分析
- Linux内存映射实现
- html怎么控制文字的行数,CSS3属性 line-clamp控制文本行数的使用
- [从头读历史] 第303节 星球战争 起始:冷兵器战争的宏观架构
热门文章
- ASP.NET Core - 在ActionFilter中使用依赖注入
- Blazor VS 传统Web应用程序
- 使用 dotnet-monitor 分析.NET 应用程序
- 快来参加学习.NET 挑战赛
- 五分钟了解dotnetcore配置框架
- 给 EF Core 查询增加 With NoLock
- 十问十答 Apache 许可证
- Asp.NET Core 轻松学-项目目录和文件作用介绍
- .NetCore从零开始使用Skywalking分布式追踪系统
- kubernetes高级之创建只读文件系统以及只读asp.net core容器