23种设计模式_MODE04代理模式_手写代码实现

简介: 23种设计模式_MODE04代理模式_手写代码实现

1.ProxyTest 代理模式

package com.zhaoshuangjian.mode04_代理模式;
import com.zhaoshuangjian.mode04_代理模式.mode04.NP非代理.UserOwn;
import com.zhaoshuangjian.mode04_代理模式.mode04.ProxyFactory;
import com.zhaoshuangjian.mode04_代理模式.mode04.VP虚拟代理.Secretary;
import com.zhaoshuangjian.mode04_代理模式.mode04.service.CommodityService;
import com.zhaoshuangjian.mode04_代理模式.mode04.service.impl.DogImpl;
import com.zhaoshuangjian.mode04_代理模式.mode04.service.impl.UserImpl;
/**
 * ProxyTest 代理模式
 *
 * @Auther: zhaoshuangjian  2023-03-23 下午10:39
 */
public class ProxyTest {
    public static void main(String[] args) {
        String uName = "奥利奥饼干";
        String dName = "狗粮";
        // 1、不使用代理
        noProxy(uName);
        // 2、使用静态代理
        useStaticProxy(uName,dName);
        // 3、使用动态代理
        useDynamicProxy(uName, dName);
        int second = 5;
        // 4、使用虚拟代理
        useVirtualProxy(second);
        /**
         * 不使用代理:没有对比就没有伤害,主要和下面使用了代理模式的对象进行比较
         * 静态代理:针对特定对象的访问进行"装饰",虽和装饰者模式很像,但也只是很像,切记搞混淆
         * 动态代理:区别静态代理,静态代理模式在程序编译时即确定了被代理的对象
         *         而动态代理只有在程序运行时才确定要被代理的对象是谁
         *        动态代理主要应用于框架,即反射技术一般用不到,如果用到了,那多半是用于框架级的项目
         *        典型代表:Spring框架 -- AOP【面向切面编程】
         * 虚拟代理:可延缓被代理对象的创建
         *        优点: 程序启动快
         *        缺点: 因为被代理的实例不是在第一时间创建的,因此在使用的时候,
         *             需要狠小心的判断null值,以防止NullPointException
         *
         * 还有其他代理模式,就不一一列举了
         */
    }
    /**
     * 不使用代理
     * @param uName 用户商品名称
     */
    private static void noProxy(String uName) {
        // 不使用代理模式,用户自己去超市买商品
        UserOwn userOwn = new UserOwn();
        userOwn.getCommodity(uName);
        System.out.println("===========分割线===========");
    }
    /**
     * 使用静态代理
     * @param uName 用户商品名称
     * @param dName 宠物狗商品名称
     */
    private static void useStaticProxy(String uName,String dName) {
        // 使用静态代理模式,通过UU跑腿服务,用户拿到自己要的薯片
        ProxyFactory.getUserProxy().getCommodity(uName);
        System.out.println("===========分割线===========");
        // 使用静态代理模式,通过UU跑腿服务,宠物狗拿到自己要的狗粮
        ProxyFactory.getDogProxy().getCommodity(dName);
        System.out.println("===========分割线===========");
    }
    /**
     * 使用动态代理
     * @param uName 用户商品名称
     * @param dName 宠物狗商品名称
     */
    private static void useDynamicProxy(String uName, String dName) {
        // 使用动态代理模式,通过UU跑腿服务,用户拿到自己要的薯片
        CommodityService userProxy =(CommodityService)( ProxyFactory.getDynProxy(new UserImpl()));
        userProxy.getCommodity(uName);
        System.out.println("===========分割线===========");
        // 使用动态代理模式,通过UU跑腿服务,宠物狗拿到自己要的狗粮
        CommodityService dogProxy =(CommodityService)( ProxyFactory.getDynProxy(new DogImpl()));
        dogProxy.getCommodity(dName);
        System.out.println("===========分割线===========");
    }
    /**
     * 使用虚拟代理
     * @param second 秒数
     */
    private static void useVirtualProxy(int second){
        Secretary secretary = new Secretary();
        secretary.addDeal("合同1");
        secretary.addDeal("合同2");
        secretary.sign();
        // 期望领导什么时候出现
        secretary.initLeader(second);
        secretary.addDeal("合同3");
        secretary.addDeal("合同4");
        secretary.sign();
    }
}

2.代理类工厂

package com.zhaoshuangjian.mode04_代理模式.mode04;
import com.zhaoshuangjian.mode04_代理模式.mode04.DP动态代理.DynamicProxy;
import com.zhaoshuangjian.mode04_代理模式.mode04.SP静态代理.DogProxy;
import com.zhaoshuangjian.mode04_代理模式.mode04.SP静态代理.UserProxy;
import com.zhaoshuangjian.mode04_代理模式.mode04.service.CommodityService;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/**
 * <p>代理类工厂</p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午10:39
 */
public class ProxyFactory {
  /**
   * 获取一个静态用户代理类对象
   */
  public static CommodityService getUserProxy() {
    return new UserProxy();
  }
  /**
   * 获取一个静态宠物狗的代理类对象
   */
  public static CommodityService getDogProxy() {
    return new DogProxy();
  }
  /**
   * 获取动态代理对象
   * @param target
   * @return
   */
  public static Object getDynProxy(Object target) {
    InvocationHandler handler = new DynamicProxy(target);
    return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler);
  }
}

3.动态代理类 == 程序运行时,代理类才知道被代理的对象是哪个

package com.zhaoshuangjian.mode04_代理模式.mode04.DP动态代理;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * <p>动态代理类 == 程序运行时,代理类才知道被代理的对象是哪个</p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午10:39
 */
public class DynamicProxy implements InvocationHandler {
  /**
   * 被代理的目标对象
   */
  private Object targetObj;
  /**
   * 暂时不知道被代理的对象是人还是动物或是其它...etc
   */
  public DynamicProxy(Object object) {
    this.targetObj = object;
  }
  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("我是UU跑腿的工作人员,我去超市帮助客户取商品:"+args[0]);
    Object object = method.invoke(targetObj, args);
    System.out.println("拿到被代理对象调用的方法名:"+method.getName()+",方法参数个数:"+method.getParameterCount());
    System.out.println("商品已成功转交给被代理的对象,期待对象好评");
    return object;
  }
}


4.用户自己去超市取商品

package com.zhaoshuangjian.mode04_代理模式.mode04.NP非代理;
import com.zhaoshuangjian.mode04_代理模式.mode04.service.CommodityService;
/**
 * <p>用户自己去超市取商品 </p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午10:39
 */
public class UserOwn implements CommodityService {
  @Override
  public void getCommodity(String name) {
    goSuperMarket();
    choose(name);
    pay();
    System.out.println("用户获得商品:"+name);
    goHome();
  }
  private void goSuperMarket() {
    System.out.println("去超市");
  }
  private void choose(String name) {
    System.out.println("选商品: " + name);
  }
  private void pay() {
    System.out.println("付钱");
  }
  private void goHome() {
    System.out.println("买完商品,回家");
  }
}

5.商品接口

package com.zhaoshuangjian.mode04_代理模式.mode04.service;
/**
 * <p>商品接口</p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午10:39
 */
public interface CommodityService {
  /**
   * 获取指定商品
   */
  void getCommodity(String name);
}

6.宠物狗实现商品接口 == 获取狗粮

package com.zhaoshuangjian.mode04_代理模式.mode04.service.impl;
import com.zhaoshuangjian.mode04_代理模式.mode04.service.CommodityService;
/**
 * <p>宠物狗实现商品接口 == 获取狗粮</p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午10:39
 */
public class DogImpl implements CommodityService{
  @Override
  public void getCommodity(String name) {
    System.out.println("宠物狗获得商品:"+name);
  }
}

7.用户实现商品类 == 获取吃的

package com.zhaoshuangjian.mode04_代理模式.mode04.service.impl;
import com.zhaoshuangjian.mode04_代理模式.mode04.service.CommodityService;
/**
 * <p>用户实现商品类 == 获取吃的</p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午10:39
 */
public class UserImpl implements CommodityService{
  @Override
  public void getCommodity(String name) {
    System.out.println("用户获得商品:"+name);
  }
}


8.宠物狗代理类 == 静态代理模式

package com.zhaoshuangjian.mode04_代理模式.mode04.SP静态代理;
import com.zhaoshuangjian.mode04_代理模式.mode04.service.CommodityService;
import com.zhaoshuangjian.mode04_代理模式.mode04.service.impl.DogImpl;
/**
 * <p>宠物狗代理类 == 静态代理模式</p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午10:39
 */
public class DogProxy implements CommodityService{
  private DogImpl dog;
  public DogProxy(){
    // 预先确定代理与被代理者的关系 -- 被代理的对象是宠物狗
    dog = new DogImpl();
  } 
  @Override
  public void getCommodity(String name) {
    System.out.println("我是UU跑腿的工作人员,我去超市帮助狗狗取狗粮:"+name);
    dog.getCommodity(name);
    System.out.println("商品已成功交给狗狗,期待狗狗的主人好评");
  }
}

9.用户代理类 == 静态代理模式,被代理的对象在编译时就知道了

package com.zhaoshuangjian.mode04_代理模式.mode04.SP静态代理;
import com.zhaoshuangjian.mode04_代理模式.mode04.service.CommodityService;
import com.zhaoshuangjian.mode04_代理模式.mode04.service.impl.UserImpl;
/**
 * <p>用户代理类 == 静态代理模式,被代理的对象在编译时就知道了</p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午10:39
 */
public class UserProxy implements CommodityService{
  /**
   * 区别于装饰者模式,这里的被代理的对象的实例是在代理的类中完成实例化的,不对外暴露
   * 虽然代理模式有点类似于装饰者模式,但是本质上还是有区别的
   * 1、代理模式主要是控制某个特定对象的访问
   * 2、装饰模式主要是给对象添加行为
   * 3、不是所有实现了接口的类对象都可以成为被代理的对象【要深刻理解这句话】
   * 4、所有实现了接口的类对象都可以成为被装饰的对象
   */
  private UserImpl user;
  public UserProxy() {
    // 预先确定代理与被代理者的关系 -- 被代理的对象是人
    user = new UserImpl();
  }
  @Override
  public void getCommodity(String name) {
    System.out.println("我是UU跑腿的工作人员,我去超市帮助用户取商品:"+name);
    user.getCommodity(name);
    System.out.println("商品已成功交给用户,期待用户好评");
  }
}


10.领导 == 实现签订接口

package com.zhaoshuangjian.mode04_代理模式.mode04.VP虚拟代理;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
/**
 * <p>领导 == 实现签订接口</p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午10:39
 */
public class Leader implements Signable{
  {
    System.out.println("各位久等了,我来了!");
  }
  /**
   * 合同列表
   */
  private List<String> deals;
  public Leader() {
    deals = new  LinkedList<>();
  }
  public List<String> getDeals() {
    return deals;
  }
  public void setDeals(List<String> deals) {
    this.deals = deals;
  }
  public void addDeal(String deal){
    this.deals.add(deal);
  }
  public void addDeals(List<String> deals){
    this.deals.addAll(deals);
  }
  @Override
  public void sign() {
    Collections.sort(this.deals);
    for (String deal : deals) {
      System.out.println("领导签订了合同:"+deal);
    }
    System.out.println();
  }
}

11.领导身边的秘书 == 将领导作为被代理的对象,但是会延缓被代理对象的创建时间,最后实现签订接口

package com.zhaoshuangjian.mode04_代理模式.mode04.VP虚拟代理;
import java.util.LinkedList;
import java.util.List;
/**
 * <p>领导身边的秘书 == 将领导作为被代理的对象,但是会延缓被代理对象的创建时间,最后实现签订接口</p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午10:39
 */
public class Secretary implements Signable{
  /**
   * 合同列表 == 当领导在的时候,这个合同列表会递交给老板,反之,则先放在秘书这里
   */
  private List<String> deals;
  private Leader leader;
  public Secretary() {
    this.deals = new LinkedList<>();
  }
  /**
   * 添加一份合同
   */
  public void addDeal(String deal){
    // 如果领导不在的话,秘书先揽收
    if(leader == null){
      this.deals.add(deal);
      System.out.println("秘书揽收了合同:"+deal);
    }else{
      // 否则,直接递交给领导
      this.leader.addDeal(deal);
      System.out.println("领导亲自揽收了合同:"+deal);
    }
  }
  @Override
  public void sign() {
    if(leader == null){
      System.out.println("领导不在,请稍等");
    }else{
      // 否者的话,领导将秘书揽收的合同拿过来
      this.leader.addDeals(this.deals);
      this.leader.sign();
    }   
  }
  static class LeaderFactory{
    public static Leader getLeader(){
      return new Leader();
    }
  }
  public void initLeader(int second){
    int n = 0;
    do{
      System.out.println("等待领导出现:"+(++n)+"秒");
    }while(--second>0);
    this.leader = LeaderFactory.getLeader();
  }
}

12.签订接口

package com.zhaoshuangjian.mode04_代理模式.mode04.VP虚拟代理;
/**
 * <p>签订接口 </p>
 *
 * @Author zhaoshuangjian  2023-03-23 下午10:39
 */
public interface Signable {
  /**
   * 定义签订方法
   */
  void sign();
}


相关文章
|
15天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
19天前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
|
5天前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
26天前
|
设计模式 Java
Java设计模式:组合模式的介绍及代码演示
组合模式是一种结构型设计模式,用于将多个对象组织成树形结构,并统一处理所有对象。例如,统计公司总人数时,可先统计各部门人数再求和。该模式包括一个通用接口、表示节点的类及其实现类。通过树形结构和节点的通用方法,组合模式使程序更易扩展和维护。
Java设计模式:组合模式的介绍及代码演示
|
1月前
|
设计模式 缓存 安全
设计模式——代理模式
静态代理、JDK动态代理、Cglib 代理
设计模式——代理模式
|
17天前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性
设计模式在PHP开发中至关重要,如单例模式确保类仅有一个实例并提供全局访问点,适用于管理数据库连接或日志记录。工厂模式封装对象创建过程,降低系统耦合度;策略模式定义算法系列并使其可互换,便于实现不同算法间的切换。合理选择设计模式需基于需求分析,考虑系统架构,并通过测试驱动开发验证有效性,确保团队协作一致性和代码持续优化。设计模式能显著提升代码质量,解决开发中的设计难题。
25 8
|
14天前
|
设计模式 算法 PHP
PHP中的设计模式:提升代码的灵活性与可维护性
在本文中,我们将深入探讨PHP编程语言中的一种重要概念——设计模式。设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它代表了最佳的实践,被有经验的面向对象的软件开发人员所采用。本文将通过具体的实例,展示如何在PHP项目中应用设计模式,以提高代码的灵活性和可维护性。无论你是PHP初学者还是经验丰富的开发者,都能从中获得有价值的见解。
|
16天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入探索与实践在软件开发的广袤天地中,PHP以其独特的魅力和强大的功能,成为无数开发者手中的得力工具。而在这条充满挑战与机遇的征途上,设计模式犹如一盏明灯,指引着我们穿越代码的迷雾,编写出更加高效、灵活且易于维护的程序。今天,就让我们聚焦于设计模式中的璀璨明珠——策略模式,深入探讨其在PHP中的实现方法及其实际应用价值。
策略模式,这一设计模式的核心在于它为软件设计带来了一种全新的视角和方法。它允许我们在运行时根据不同情况选择最适合的解决方案,从而极大地提高了程序的灵活性和可扩展性。在PHP这门广泛应用的编程语言中,策略模式同样大放异彩,为开发者们提供了丰富的创作空间。本文将从策略模式的基本概念入手,逐步深入到PHP中的实现细节,并通过一个具体的实例来展示其在实际项目中的应用效果。我们还将探讨策略模式的优势以及在实际应用中可能遇到的挑战和解决方案,为PHP开发者提供一份宝贵的参考。
|
15天前
|
设计模式 存储 数据库连接
探索PHP中的设计模式:提高代码的可维护性与扩展性
本文将深入探讨PHP中常用的设计模式,包括单例模式、工厂模式和观察者模式。通过具体的代码示例,展示如何在实际项目中应用这些设计模式,以提高代码的可维护性与扩展性。无论你是PHP初学者还是有一定经验的开发者,都可以通过本文的学习,提升你的编程技巧和项目架构能力。
|
22天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。

热门文章

最新文章