其他分享
首页 > 其他分享> > 代理模式:代码构建我们的奶茶王朝

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

作者:互联网

第一家奶茶店

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

  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