Java设计模式-结构性设计模式(代理设计模式)

简介

  为其他对象提供⼀种代理以控制对这个对象的访问,属于结构型模式。
  客户端并不直接调⽤实际的对象,⽽是通过调⽤代理,来间接的调⽤实际的对象

应用场景

  各⼤数码专营店,代理⼚商进⾏销售对应的产品,代理商持有真正的授权代理书
  客户端不想直接访问实际的对象,或者访问实际的对象存在困难,通过⼀个代理对象来完成间接的访问
  想在访问⼀个类时做⼀些控制,或者增强功能

在这里插入图片描述

角色

Subject

  抽象接⼝,真实对象和代理对象都要实现的⼀个抽象接⼝,好⽐销售数码产品

Proxy

  包含了对真实对象的引⽤,从⽽可以随意的操作真实对象的⽅法,好⽐ 代理加盟店

RealProject

  真实对象,好⽐⼚商销售数码产品

案例demo

xxxx想卖手机,为以后退休⽣活做准备,代理各⼤⼚商的⼿机和电脑,⽤代理设计模式帮他实现下

  Subject 卖⼿机
  RealProject 苹果、华为⼚商,核⼼是卖⼿机,但是选址不熟悉
  Proxy ⽼王数码专卖店:代理卖⼿机,附加选地址,增加⼴告等

抽取公共接口

/**
 * 抽取公共的方法
 */
public interface DigitalSell {
    
    

    void sell();
}

真实对象

/**
 * 真实对象
 **/

public class DigitalSellReal implements DigitalSell{
    
    

    @Override
    public void sell() {
    
    

        System.out.println("销售华为手机");
    }
}

代理对象

/**
 * 代理对象,增加了功能
 **/

public class DigitalSellProxy implements DigitalSell {
    
    

    private DigitalSell realObj = new DigitalSellReal();

    @Override
    public void sell() {
    
    

        
        makeAddress();
        realObj.sell();
        makeAD();

    }



    private void makeAddress(){
    
    
        System.out.println("一个人流量很高的地址");
    }


    private void makeAD(){
    
    
        System.out.println("投放广告");
    }

}

测试

public class Main {
    
    

    public static void main(String[] args) {
    
    


        //真实对象的行为
        DigitalSell realObj = new DigitalSellReal();
        realObj.sell();

        System.out.println("===");
        //代理对象的行为
        DigitalSell proxy = new DigitalSellProxy();
        proxy.sell();


    }
}

结果

销售华为手机
===
一个人流量很高的地址
销售华为手机
投放广告

优缺点

优点

  可以在访问⼀个类时做⼀些控制,或增加功能
  操作代理类⽆须修改原本的源代码,符合开闭原则,系统具有较好的灵活性和可扩展性

缺点

  增加系统复杂性和调⽤链路

与动态代理区别

  动态代理也有多种⽅式,cglib、jdk

和装饰器模式的区别

  保护⽬标对象
  增强⽬标对象,和装饰模式类似了

猜你喜欢

转载自blog.csdn.net/csdn_mycsdn/article/details/132782272