掘金日新计划 · 8 月更文挑战第2天--java静态代理

160 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

代理:平时我们去看明星的演唱会,是不是都得去买票,比如说区大麦网,黄牛,他们就是代理,通过向代理买票,我们就可以看到喜欢的明星,接下来我们通过代码来实现一下

1.(IService)创建基本的唱歌服务类,每个明星要开演唱会都得实现这个方法

package com.proxy.service;
//定义接口IServer和唱歌方法sing()
public interface IService {
    public void sing();
}

2.(LiuService.java)今天刘德华说要来开演唱会了,我们该怎么处理呢?实现IService类,并且得实现sing方法

package com.proxy.service;
//定义具体类并实现接口
public class LiuService implements IService {
    @Override
    public void sing() {
        System.out.println("刘德华唱歌");
    }
}

其他明星呢,比如陈奕迅也要来(ChenService.java)

package com.proxy.service;

public class ChenService implements IService{
    @Override
    public void sing() {
        System.out.println("陈奕迅唱歌");
    }
}

3.(Agent.java)代理商听说要开演唱会了,这时候准备开始卖票了,代理也必须实现IService,并且实现对应的sing方法,实例化对应的明星,调用唱歌的方法

package com.proxy.service;
//定义代理类
public class Agent implements IService {
    @Override
    public void sing() {
        //传入对象并且调用方法
        System.out.println("开始卖票");
//       LiuService service = new LiuService();
        ChenService service = new ChenService();
        service.sing();
        System.out.println("演唱会结束");
    }
}

4.(Demo.java)客户开始买票了,通过实例化代理对象,然后调用代理的sing方法

package com.proxy.service;

public class Demo {
    public static void main(String[] args) {
        IService iService = new Agent();
        iService.sing();
    }
}

5.我们看看具体文本代码结构

Dingtalk_20220802111559.jpg

    1.先创建基本的IService接口和定义对应的空方法    
    2.实现的IService并且实现具体的方法,如果LiuService Implements IService
    3.定义代理类 Implements和实现具体的sing类,其中实现具体的sing类,代理类要传入具体的类并且调用具体方法:如    
    System.out.println("开始卖票");
    LiuService service = new LiuService();
    ChenService service = new ChenService();
    service.sing();
    System.out.println("演唱会结束");
    4.调用    
    创建代理类并且使用Iservice获取对应的对象,然后调用sing方法        

6.接下来我们改进一下每次代理都要new对象

package com.proxy.service;
import javax.xml.ws.Service;
//定义代理类
public class Agent implements IService {
    //每次都要重新new 对象很麻烦,我们直接在初始化的时候写入
    private IService target;
    public Agent(IService target){
        this.target = target;
    }
    @Override
    public void sing() {
        //传入对象并且调用方法
        System.out.println("开始卖票");
        target.sing();
        System.out.println("演唱会结束");
    }
}

7.开演唱会

package com.proxy.service;

public class Demo {
    public static void main(String[] args) {
        //陈奕迅开演唱会 哪个明星过来,就把对应的对象传入即可
        IService iService = new Agent(new ChenService());
        iService.sing();
        //刘德华开演唱会
        IService iService2 = new Agent(new LiuService());
        iService2.sing();
    }
}