数据模式代理模式浅出
发布于 1 个月前 作者 stvenyin 28303 次浏览 来自 新手入门
  • 个人分类:开发模式 --随笔

  • 版权声明:本文为博主原创文章,未经博主允许不得转载.https://blog.csdn.net/zengke1993/article/details/79830506

  • —前序:本文为《Androdi源码及开发模式》的学习笔记。

  • 1.定义:

  • 为其他对象提供一种代理以控制对这个对象的访问。

  • 2.使用场景:

  • 当无法或不想直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问 ,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口。

  • 当要对某个对象的实现方法时,要对其前后做操作,但又不想改变它原有对象,这时就要用到代理。

  • 3.UML图: image.png

  • clipboard

  • 代码实现:

  • 公共接口 Subject:

  • public interface Subject {

  • void visit();
    
  • }

  • 真正主题类:

  • public class RealSubject implements Subject {

  • //RealSubject的实现
    
  • [@Override](/user/Override)
    
  • public void visit() {
    
  •     System.out.print("RealSubject visit");
    
  • }
    
  • }

  • 代理类:

  • public class ProxyObject implements Subject {

  • Subject mSubject = null;
    
  • public ProxyObject(Subject subject) {
    
  •     mSubject = subject;//持有要被代理的Subject
    
  • }
    
  • [@Override](/user/Override)
    
  • public void visit() {
    
  •     mSubject.visit(); //实际调用的是被代理这的实现
    
  • }
    
  • }

  • 使用:

  • RealSubject realSubject = new RealSubject();

  • ProxyObject proxyObject = new ProxyObject(realSubject);

  • proxyObject.vistit();

  • 例子:

  • 张三在大城市苦逼地敲了几年代码,终于赚够钱回老家盖房子了。盖房子要搭框架,砌砖,水电,装修。张三虽然也是搬砖的,但是是在电脑上啊,他不可能自己去建房子啊,那怎么办呐,那就要找工人帮忙建啊。

  • 建房子的接口类:

  • public interface IBuildHouse {

  • void framework(); //搭框架
    
  • void bricking();  //砌砖
    
  • void waterElectricity(); // 水电
    
  • void fitment(); //装修
    
  • }

  • 张三:真正建房子的人:

  • public class ZhangSan implements IBuildHouse {

  • [@Override](/user/Override)
    
  • public void framework() {
    
  •     System.out.print("搭框架");
    
  • }
    
  • [@Override](/user/Override)
    
  • public void bricking() {
    
  •     System.out.print("砌砖");
    
  • }
    
  • [@Override](/user/Override)
    
  • public void waterElectricity() {
    
  •     System.out.print("安装水电");
    
  • }
    
  • [@Override](/user/Override)
    
  • public void fitment() {
    
  •     System.out.print("装修");
    
  • }
    
  • }

  • 工人: 代理建房子的人

  • public class Worker implements IBuildHouse {

  • IBuildHouse mIBuildHouse;
    
  • //持有要建房子的对象

  • public Worker(IBuildHouse iBuildHouse) {
    
  •     mIBuildHouse = iBuildHouse;
    
  • }
    
  • [@Override](/user/Override)
    
  • public void framework() {
    
  •     mIBuildHouse.framework();
    
  • }
    
  • [@Override](/user/Override)
    
  • public void bricking() {
    
  •     mIBuildHouse.bricking();
    
  • }
    
  • [@Override](/user/Override)
    
  • public void waterElectricity() {
    
  •     mIBuildHouse.waterElectricity();
    
  • }
    
  • [@Override](/user/Override)
    
  • public void fitment() {
    
  •     mIBuildHouse.fitment();
    
  • }
    
  • }

  • 开始建房子

  • Worker worker = new Worker(new ZhangSan());

  • worker.framework();

  • worker.bricking();

  • worker.waterElectricity();

  • worker.fitment();

  • 5.代理模式的好处:

  • 代理模式的好处就是对外部提供统一的接口方法,而代理类在接口中实现对真实的类的附加操作,从而可以在不影响外部调用的情况下,进行系统的扩展。

  • 也就是说,我要修改真实角色的操作的时候,尽量不要修改它,而是在外部再包一层进行附加行为。即代理类。从而达到了“对修改关闭,扩展开放”的原则,保证了系统的稳定性。

  • 6.Android中的使用:

  • 在Android开发中,经常会用到代理模式。譬如现在的主流MVP框架。我在View层要加载一张图片,那我不可能在View层做这些操作,那我就要委托给P层去处理。因为加载图片是耗时操作,那我肯定要在加载图片放到另外一个线程处理,而加载完成之前要弹一个Loading框。而开启线程和弹loading框这些都是附加操作,View层是不管的,都是代理者P层器添加的。

回到顶部