代理设计模式在Android开发中的应用

开源新作,安卓驱动工程师面试题 前言 Offer: 腾讯,头条 ,网易互娱 ,bigo ,虎牙 挂了: 阿里,华为,cvte 今年移动端确实很好找工作,主要复习时间是4月 – 8月, 其中6月开始入职腾讯,开启苦逼又牛逼的边实习边复习模式。 8月底离职腾讯后,可能是转正希望足够大,也可能是前面压抑得太久,直接就进入放飞自我模式,基本放下了学习。 只有在出发去面试的路上,复习一下缓解紧张。 以下是本人对如何准备面试的看法,基于本人非常有限的经验,各位看官看看即好。 1.你所知道的设计模式有哪些? 参考回答 创建型模式,共五种:工厂方法 阅读详情
1. 模式定义

为其他对象提供一种代理以控制对这个对象的访问,分为静态代理和动态代理,代理模式也被称为委托模式,它是结构型设计模式的一种。在现实生活中我们用到类似代理模式的场景有很多,比如代理上网、打官司等。编程的思想其实有的时候和生活差不多。

2. 代理模式的差异

静态代理,在代码运行前就已经存在了代理类的class编译文件;而动态代理则是在代码运行时通过反射来动态地生成代理类的对象,并确定到底来代理谁。也就是我们在编码阶段无须知道代理谁,代理谁将会在代码运行时决定。

在我们日常开发中,有一些类似于功能入口的列表,每个按钮跳转到不同的页面,下面我们以页面跳转为例,用代理设计模式进行讲解。

3. 静态代理

IItemClick:提供跳转到各个页面的方法 的接口

/**
 * 提供跳转到各个页面的方法 的接口
 */
public interface IItemClick {
    void goToMain();
    void goToDetail();
}

ButtonList:需要被代理跳转操作的类

/**
 * 需要被代理跳转操作的类
 */
public class ButtonList implements IItemClick {

    private int clickPosition;

    public void setClickPosition(int clickPosition) {
        this.clickPosition = clickPosition;
    }

    public int getClickPosition() {
        return clickPosition;
    }

    @Override
    public void goToMain() {
        // 跳转到首页
    }

    @Override
    public void goToDetail() {
        // 跳转到详情页
    }
}

JumpStaticProxy:跳转事务静态代理类

/**
 * 跳转事务代理类
 */
public class JumpStaticProxy implements IItemClick {

    private IItemClick iItemClick;

    public JumpStaticProxy(@NonNull IItemClick iItemClick) {
        this.iItemClick = iItemClick;
    }

    @Override
    public void goToMain() {
        iItemClick.goToMain();
    }

    @Override
    public void goToDetail() {
        iItemClick.goToDetail();
    }
}

StaticProxyTestClient:用法,测试类

/**
 * 测试类
 */
public class StaticProxyTestClient {

    public static void main(String[] args){
        ButtonList buttonList = new ButtonList();
        JumpStaticProxy jumpStaticProxy = new JumpStaticProxy(buttonList);
        if (buttonList.getClickPosition() == 0) {
            jumpStaticProxy.goToMain();
        } else if (buttonList.getClickPosition() == 1) {
            jumpStaticProxy.goToDetail();
        }
    }
}
4. 动态代理

假设这时候,我们在列表中增加了一个按钮,是跳转到设置页,那么要是在静态代理的写法需要同时改动 IItemClick、ButtonList、JumpStaticProxy,这样的拓展性不高,那用动态代理怎样写呢?Java 提供了 动态的代理接口 InvocationHandler,实现该接口需要重写invoke() 方法。

IItemClick:提供跳转到各个页面的方法 的接口

/**
 * 提供跳转到各个页面的方法 的接口
 */
public interface IItemClick {
    void goToMain();
    void goToDetail();
    // 增加的方法
    void goToSetting();
}

ButtonList:需要被代理跳转操作的类

/**
 * 需要被代理跳转操作的类
 */
public class ButtonList implements IItemClick {

    private int clickPosition;

    public void setClickPosition(int clickPosition) {
        this.clickPosition = clickPosition;
    }

    public int getClickPosition() {
        return clickPosition;
    }

    @Override
    public void goToMain() {
        // 跳转到首页
    }

    @Override
    public void goToDetail() {
        // 跳转到详情页
    }

    @Override
    public void goToSetting() {
        // 跳转到设置页
    }
}

JumpDynamicProxy:核心类,跳转事务动态代理类

/**
 * 跳转事务动态代理类
 */
public class JumpDynamicProxy implements InvocationHandler {
    /**
     * 被代理的对象
     */
    private Object mObject;

    public JumpDynamicProxy(Object object) {
        this.mObject = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 执行方法 ,目标接口调用的方法都会来到这里面
        // 调用被代理对象的方法
        Object object = method.invoke(mObject, args);
        return object;
    }
}

DynamicProxyTestClient:动态代理用法介绍

public class DynamicProxyTestClient {
    public static void main(String[] args) {
        ButtonList buttonList = new ButtonList();

        IItemClick itemClick =
                // 返回的是 IBank 的一个实例对象,这个对象是由 Java 给我们创建的 ,调用的是 jni
                (IItemClick) Proxy.newProxyInstance(
                        IItemClick.class.getClassLoader(), // ClassLoader
                        new Class<?>[]{IItemClick.class},  // 目标接口
                        new JumpDynamicProxy(buttonList)   // JumpDynamicProxy (这个类是关键)
                );
        if (buttonList.getClickPosition() == 0) {
            itemClick.goToMain();
        } else if (buttonList.getClickPosition() == 1) {
            itemClick.goToDetail();
        } else {
            itemClick.goToSetting();
        }
    }
}
5. 总结

从上面可以看出,动态代理的拓展性优于静态代理,静态代理效率要高于动态代理,设计模式只是方便我们写好代码,静态和动态,需要读者自行斟酌使用。

2024中级Android开发面试解答之设计模式篇 MVP彻底解决了MVC中View和Controller傻傻分不清楚的问题,但是随着业务逻辑的增加,一个页面可能会非常复杂,UI的改变是非常多,会有非常多的case,这样就会造成View的接口会很庞大。而MVVM就解决了这个问题,通过双向绑定的机制,实现数据和UI内容,只要想改其中一方,另一方都能够及时更新的一种设计理念,这样就省去了很多在View层中写很多case的情况,只需要改变数据就行。面试常客:Okhttp,Retrofit,Glide,RxJava,GreenDao,Dagger等。 阅读详情

相关推荐

XianYuAutoDeliveryX:基于闲鱼API与大模型的智能自动发货系统实践

本文详细介绍了如何利用XianYuAutoDeliveryX系统,结合闲鱼API与大语言模型,构建一个智能自动发货解决方案。该系统能实现买家付款后秒级自动发货,并通过对接ChatGPT等大模型智能回复买家咨询,有效解放卖家时间,提升虚拟商品店铺的运营效率和客户体验。

bush的博客 1015

Android设计模式详解之代理模式

代理模式也称为委托模式,是一种结构型设计模式;为其他对象提供一种代理以控制对这个对象的访问;当无法或不想直接访问某个对象或访问某个对象存在困难时,可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口;UML类图:抽象主题类,该类的主要职责是申明真实主题与代理的共同接口方法,该类即可以是一个抽象类也可以是一个接口;

故不积跬步无以至千里 1925

STM32 ST-LINK Utility 无法烧录程序的解决方法

当你打开STM32 ST-LINK Utility,硬件连接好st-link V2,打开了要烧写的文件,点那个Program verify烧录时, 如果出错了: Programming error @ 0x08000000! 我的方法是: 点你想要烧录那个HEX文件的小格,复制 然后去到你前面的文件的格子里,点粘贴: 成功! ...

wocute的博客 9521

Android设计模式—代理模式

代理模式也是平时比较常用的设计模式之一。所谓代理模式就是在进行交互的时候,不和原本的对象直接交互,而是通过代理的方式,用代理来代替真正的对象进行交互,这样做的好处是降低了耦合性。 代理模式其实就是提供了一个新的对象,实现了对真实对象的操作,或成为真实对象的替身。在日常生活中也是很常见的。例如A要租房,为了省麻烦A会去找中介,中介会替代A去筛选房子,A坐享中介筛选的结果,并且交房租也是交给中介,这就是一个典型的日常生活中代理模式的应用。平时打开网页,最先开到的一般都是文字,而图片等一些大的资源都会延迟加载,这

zenmela2011的专栏 1839

高通SDX12:ProSLIC Si32185移植调试

高通 SDX12 语音芯片slic 音频驱动 Si32185

不秃头的程序猿Gabriel的博客 2038

YOLOv8交通监控全方案:精准车辆计数+违章(闯红灯/压线)识别,拿来就落地!

作为深耕计算机视觉落地的开发者,我见过太多交通监控的“伪智能”——传统系统要么车辆计数不准(漏计/重复计数),要么违章识别滞后(靠人工回看录像),甚至连“闯红灯、压线”这类常见违章都无法实时判定,完全满足不了实际交通管理需求。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 646

Android常见设计模式——代理模式(Proxy Pattern)

文章目录1. 前言2. 代理模式(Proxy Pattern)2.1 静态代理模式2.2 动态代理模式3. Android 中的代理模式3.1 Retrofit中的代理模式(没有被代理者) 1. 前言 首先看下百度百科对代理模式的介绍: 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 其实也就是中介模式或者委托模式。在日常生活中代理模式很多,比如叫同事带饭、打官司等。使用代理模式的

梦否 2924

Python内置函数zip()——《Python内置函数手册》Python老吕编著

zip()函数是 Python 中的一个内置函数,用于将多个可迭代对象(如列表、元组、字符串等)中对应的元素打包成一个个元组,然后返回由这些元组组成的迭代器。zip()函数常用于将多个序列并行迭代,或者用于数据对齐。zip()它返回一个迭代器,这意味着你可以逐个获取打包后的元素,而不是一次性将所有元素加载到内存中。如果输入的可迭代对象长度不一致,zip()会以最短的可迭代对象为准,只打包到最短对象的末尾。它可以用来并行迭代多个序列,使得代码更加简洁和高效。在接下来的章节中,我们将详细介绍。

Python老吕的博客 680

【Android面试八股文】你能说一说什么是代理模式?静态代理和动态代理分别是什么?如何实现?

静态代理是在编译时确定代理类的具体实现,即代理类的源代码在编译期间就已经确定。通常情况下,需要手动编写代理类,且代理类与委托类实现同样的接口或继承同样的父类。静态代理的实现比较简单,但是当需要代理的类较多时,会导致代理类数量庞大,维护困难。使用一个类代表另一个类的功能,在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。动态代理是在运行时动态生成代理类的方式,无需手动编写代理类。在编译时已经确定代理类的具体实现,需要为每个被代理类编写一个代理类。

字节卷动 1794

TSP:车为什么能和云端交互?

TSP:车为什么能和云端交互?

天赐好车的博客 410

【Qt图书管理系统】5.完整版源码及下载地址

Qt图书管理系统完整源码下载。

小鱼酱的博客 7001

Android常用设计模式-代理模式

代理模式是Java中常用的设计模式之一,主要用于为其他对象提供一种代理以控制对这个对象的访问。

maoning20080808的专栏 747

SAP 采购订单入库——移动类型

业务场景:采购入库,实物入库至仓库,然后系统同步过账。MIGO:收货、采购订单。 MVT:101 入库,---库存增加。 MVT:移动类型,就是代表业务场景,(比如入库、发货,成本中心发、工单发、报废、盘赢、盘亏等等) 移动类型 1、正向采购入库:101 2、反向冲销(MIGO)102:与101相反,用于错误操作的反向冲销。参考原凭证,全部进行一...

willieyuan的博客 7779

安卓开发设计模式(二)——结构型设计模式

分析:RecyclerView只依赖Adapter接口,不关心数据来源,UserAdapter持有原始数据List<User>,并实现了RecyclerView.Adapter接口,当RecyclerView需要展示数据时,会调用Adapter的方法,Adapter负责把数据转换成View。代理模式的核心就是找个“中间人”帮你做事,这个“中间人”就是代理,它能控制对原始对象的访问。继承抽象装饰器,重写需要增强的方法,在调用父类(原始组件)方法的前/后加上自己的逻辑,不重写的方法沿用抽象装饰器的默认转发。

. 826

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

当Android遇上设计模式之代理(Proxy)模式

文章目录1. 代理模式1.1 代码实现1.2 使用场景2. 静态代理与动态代理 设计模式六大原则: 单一职责原则:就一个类仅有一个引起它变化的原因,即类承担的职责单一性; 开放封闭原则:类、模块、函数等应该是可以扩展的,但是不可修改。换句话说,就是面对需求的改变要尽可能地保证相对稳定,尽量通过扩展的方式而不是修改原有的代码来实现。 里氏替换原则:所有引用基类(父类)的地方必须透明地使...

老蒋也疯狂 5696

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

安卓开发用到的设计模式(2)结构型模式

本文介绍了安卓开发中常用的五种结构型设计模式:适配器模式(用于RecyclerView和网络请求适配)、装饰器模式(扩展Context功能与View装饰)、代理模式(管理图片加载和权限检查)、桥接模式(实现主题切换和数据存储分离)以及组合模式(构建View树结构和菜单层级)。这些模式通过解耦接口与实现、复用对象结构等方式,有效提升了代码的可维护性和扩展性,是安卓开发中的核心架构思想。

分享Android应用和系统开发、音视频编码、性能优化相关知识 1212

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android设计模式-代理模式

介绍代理模式(Proxy Patter)也称委托模式,属于结构型设计模式。这是一个相当重要的设计模式,Android源码中随处可见。何为代理模式呢?比如每天吃饭时赶进度是常事,就叫公司的同时帮忙买饭,这就是一种代理;如果碰到辞职时老板不给发工资,还得委托个律师 帮你打官司,这也是代理。总之,即便在现实生活中,代理也是无处不在。定义为其他对象提供一种代理以控制这个对象的访问。使用场景当无法或者不想直接

vanpersie_9987的博客 1397

部分JAVA设计模式在Android中的体现。

设计模式在安卓中的体现 。 代理模式: 创建代理类,就是为其他对象提供一种访问代理, 常用的类ActivityManager,, 它相当于代理模式的类图中的client。在这个类中,可以看到大量的getxxx函数,这些函数, 都会调用到ActivityManagerNative类的getDefault()方法,而该方法会获得一个共用的单例的IActivityManager引用,

693的专栏 473

小论设计模式及在Android中的应用

本文主要总结下几个常用的设计模式在Android中的使用。涉及到的设计模式如下: 单例模式 工厂模式 策略模式 代理模式 模板方法模式 建造者模式 外观模式 一.单例模式 1.1 模式说明 实现1个类只有1个实例化对象 &amp; 提供一个全局访问点 1.2 作用(解决的问题) 保证1个类只有1个对象,降低对象之间的耦合度 1.3实现方式 其中饿汉模式和静态内部内实现不需要上锁也能保证是线程安...

海峰的博客 2071

Java代理以及在Android中的一些简单应用

Java代理设计模式的含义: Java中的代理设计模式(Proxy),提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.代理设计模式在现实生活中无处不在,举个例子,一般明星都有个经纪人,这个经纪人的作用就是类似代理了,如果有谁想找明星,首先要通过经纪人,然后经纪人再转告明星去做某些事情,这里要注意的是:...

weixin_34194551的博客 115

跟着Android学设计模式:代理(proxy)

Android Context所使用的代理设计模式UML图

Sailingthink的专栏 1943

Java篇 - 代理模式和动态代理实现原理

  设计模式中有一种模式叫代理模式,Spring框架离不开动态代理技术,Android hook技术用到了反射 + 动态代理,Framework中我们也经常看到各种proxy,如ApplicationThreadProxy, ActivityManagerProxy。 那么,今天就来说下Java中的代理模式和动态代理。   目录: 代理模式 静态代理 动态代理 代理模式的优缺点...

u014294681的博客 1863

Android常用面向对象设计模式

对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次。而在android开发中,必要的了解一些设计模式又是必须的,因为设计模式在Android源码中,可以说是无处不在。下面要说的java面向对象的设计模式,对于想深入学习设计模式的同学,这里推荐两本书:《Android源码设计模式解析与实战》、《大话设计模式》。 前言 设计模式(Desig...

博由心生,福泽一生 2022

JAVA设计模式——代理模式

本人之前学的java web,后来转的android方向,发现写android的人都是天才,其中很多也应用到了java设计模式,说起java设计模式,大家都能说出几个,比如android中application(单例模式)、众多的监听器(观察者模式),众多的适配器adapter(适配器模式)、处理图像的工厂模式……等等,可是大家有没有自己去实现乃至去用这些良好的设计模式来设计自己的代码呢?很多答案是

@EddieYuan 1130

代理设计模式 - 实现 Retrofit 的 create

相信大家都很熟悉 Retrofit 了,这篇文章不会讲使用,如果不是特别熟悉 Retrofit 的使用,可以去看看其他的一些文章。如果实在不想看那也没关系,因为今天的主要内容并不是 Retrofit ,而是代理设计模式。只是在讲解的过程中顺便讲一下代理设计模式的运用。先来看看开发中哪些地方可以用到: Android 插件化架构之绕过 AndroidManifest 检测(动态代理) Android

z240336124的专栏 1082
上一篇: 观察者设计模式在Android开发中的应用
下一篇: LeakCanary 源码深挖
胡小明同学
博客等级 码龄10年 35粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值