ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

代理模式:代码构建我们的奶茶王朝

2021-06-20 16:30:19  阅读:155  来源: 互联网

标签:IBubbleShop void public 构建 奶茶 Override iBubbleShop 代码


第一家奶茶店

奶茶现在这么受大众的欢迎,那这么好赚钱的门路肯定不能错过。
那如果想开一家奶茶店需要什么步骤呢,经过一番观察,前期可能需要购买设备、原料、店铺、人工等等。
那我们可以用代码来实现我们的第一家奶茶店

  1. 定义一个奶茶店接口
public interface IBubbleShop {
    // 店铺
    void shop();
    // 原料
    void ingredient();
    // 员工
    void staff();
    // 设备
    void facility();
    // 正常营业
    void normalBusiness();
}
  1. 奶茶店实现类
public class BubbleShop implements IBubbleShop {

    // 奶茶店名称
    private String name;

    public BubbleShop(String name){
        this.name = name;
    }

    @Override
    public void shop() {
        System.out.println("租店铺!");
    }

    @Override
    public void ingredient() {
        System.out.println("购买原材料!");
    }

    @Override
    public void staff() {
        System.out.println("雇员工!");
    }

    @Override
    public void facility() {
        System.out.println("购买设备!");
    }

    @Override
    public void normalBusiness() {
        System.out.println("二杠杆奶茶点开始营业了");
        System.out.println("卖出一杯奶茶!");
    }

}
  1. 开业
public class BubbleShopMain {

    public static void main(String[] args) {
        // 定义一个名叫二杠杆的奶茶店
        IBubbleShop bubbleShop = new BubbleShop("二杠杠");
        // 前期准备
        bubbleShop.shop();
        bubbleShop.facility();
        bubbleShop.ingredient();
        bubbleShop.staff();
        // 开始营业
        bubbleShop.normalBusiness();
    }
}

/**
 * 运行结果:
 *
 * 租店铺!
 * 购买设备!
 * 购买原材料!
 * 雇员工!
 * 二杠杆奶茶点开始营业了
 * 卖出一杯奶茶!
 */
 

通过以上步骤,我们的“二杠杠“奶茶店终于开业了!

经过了一年的努力,我们的奶茶店火了。那我们肯定不满足一家店的带来的收益,我们要做大,那就开启品牌加盟模式。

品牌加盟

由于“二杠杠”奶茶店的名气,很多商家想加盟我们的品牌。那前期为了推广,那就不设置加盟条件了,直接让大家使用名气,毕竟韭菜得先养才好割。

  1. 定义一个代理商家
public class BubbleShopProxy implements IBubbleShop {

    private IBubbleShop iBubbleShop;

    public BubbleShopProxy(IBubbleShop iBubbleShop){
        this.iBubbleShop = iBubbleShop;
    }

    @Override
    public void shop() {
        this.iBubbleShop.shop();
    }

    @Override
    public void ingredient() {
        this.iBubbleShop.ingredient();
    }

    @Override
    public void staff() {
        this.iBubbleShop.staff();
    }

    @Override
    public void facility() {
        this.iBubbleShop.facility();
    }
    
    @Override
    public void normalBusiness() {
    	System.out.println("加盟店准备就绪");
        this.iBubbleShop.normalBusiness();
    }
    
}
  1. “二杠杠“加盟店开业
public class BubbleShopMain {

    public static void main(String[] args) {
        IBubbleShop erganggang = new BubbleShop("二杠杠");
        IBubbleShop proxy = new BubbleShopProxy(erganggang);
        // 加盟店的前期准备
        proxy.shop();
        proxy.facility();
        proxy.ingredient();
        proxy.staff();
        // 加盟店开始营业
        proxy.normalBusiness();
    }
}

/**
 * 运行结果:
 *
 * 租店铺!
 * 购买设备!
 * 购买原材料!
 * 雇员工!
 * 加盟店准备就绪
 * 二杠杆奶茶点开始营业了
 * 卖出一杯奶茶!
 */

以上代码我们实现了商家的加盟。

又经过了一年,“二杠杠”奶茶店更火了。加盟的商家更多了。那我们开始提出我们的加盟条件了,需要缴纳10w的加盟费,每个商家卖出一杯奶茶我们抽成2块钱(是不是很资本家)。

  1. 对于加盟的条件我们新增一个接口
public interface ProxyCondition {

    // 加盟费
    void initalFee();
    // 抽成
    void cut();
}
  1. 新的加盟条件发布后,也有新的商家加盟了。
    我们来实现一个新加盟商家的类
public class BubbleShopProxy implements IBubbleShop, ProxyCondition {

    private IBubbleShop iBubbleShop;

    public BubbleShopProxy(IBubbleShop iBubbleShop){
        this.iBubbleShop = iBubbleShop;
    }

    @Override
    public void shop() {
        this.initalFee();
        this.iBubbleShop.shop();
    }

    @Override
    public void ingredient() {
        this.iBubbleShop.ingredient();
    }

    @Override
    public void staff() {
        this.iBubbleShop.staff();
    }

    @Override
    public void facility() {
        this.iBubbleShop.facility();
    }

    @Override
    public void normalBusiness() {
        System.out.println("加盟店准备就绪");
        this.iBubbleShop.normalBusiness();
        this.cut();
    }

    @Override
    public void initalFee() {
        System.out.println("缴纳10w加盟费");
    }

    @Override
    public void cut() {
        System.out.println("一杯奶茶抽成2块钱");
    }
}

/**
 * Main方法不需要更改。
 * 运行结果:
 *
 * 缴纳10w加盟费
 * 租店铺!
 * 购买设备!
 * 购买原材料!
 * 雇员工!
 * 加盟店准备就绪
 * 二杠杆奶茶点开始营业了
 * 卖出一杯奶茶!
 * 一杯奶茶抽成2块钱
 */

新的加盟条件发布后。我们的收益又提升了。

二杠杠奶茶店公司

由于“二杠杠”奶茶店太火了,加盟的人很多。所以我们需要开一家公司,公司专门处理加盟的事务。
再此我们先引人一个概念,动态代理。动态代理指的是通过代理的接口来动态生成代理类。
目前JDK实现动态代理的方式有两种。基于JDK的动态代理及基于CGILB的动态代理。

以下拿JDK的动态代理为例。实现JDK动态代理主要包括两步

  1. 创建一个类实现InvocationHandler接口,且必须实现invoke方法。
  2. 通过Proxy.newProxyInstance初始化一个代理,最后通过代理调用具体方法。

开设一个公司就好比实现动态代理。接下来回到我们的奶茶店上。

  1. 创建我们的“二杠杠”公司
public class BubbleShopIH implements InvocationHandler {

    // 被代理的实例
    Object obj;

    public BubbleShopIH(Object obj) {
        this.obj = obj;
    }

    // 调用被代理的方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (method.getName().equals("shop")) {
            System.out.println("缴纳10w加盟费");
        }

        if (method.getName().equals("normalBusiness")) {
            System.out.println("加盟店准备就绪");
        }

        Object result = method.invoke(this.obj, args);

        if (method.getName().equals("normalBusiness")) {
            System.out.println("一杯奶茶抽成2块钱");
        }

        return result;
    }
}
  1. 新的商家通过公司进行加盟
public class BubbleShopIHMain {

    public static void main(String[] args) {
        IBubbleShop bubbleShop = new BubbleShop("二杠杠");
        InvocationHandler handler = new BubbleShopIH(bubbleShop);

        // 动态产生一个代理者
        IBubbleShop proxy = (IBubbleShop) Proxy.newProxyInstance(bubbleShop.getClass().getClassLoader(),
                new Class[]{IBubbleShop.class},
                handler);
        proxy.shop();
        proxy.facility();
        proxy.ingredient();
        proxy.staff();
        proxy.normalBusiness();

    }

}

/**
* 运行结果:
*
*  缴纳10w加盟费
*  租店铺!
*  购买设备!
*  购买原材料!
*  雇员工!
*  加盟店准备就绪
*  二杠杠奶茶点开始营业了
*  卖出一杯奶茶!
*  一杯奶茶抽成2块钱
*/

到此我们创建了自己的公司,有了专门的流程(代理类的invoke方法),我们的奶茶王朝已经建立玩完成。

总结

1.代理包含两种方式:静态代理和动态代理(开设公司前为静态代理)
2.代理模式是应用非常广泛的模式。Spring AOP的实现原理便是代理模式。

希望通过奶茶店的方式可以给你一个理解的思路。如果你觉得文章不错,可以点个赞。你的支持是我前进的动力。

标签:IBubbleShop,void,public,构建,奶茶,Override,iBubbleShop,代码
来源: https://blog.csdn.net/qq_41831553/article/details/118054474

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有