设计模式——代理模式

245 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

概述

简单了解就是,在原本可以直接操作的类中间放一层代理层

也就是原本一个类的功能,可以被另一个代理类来使用

实际例子

  1. 跳板机,通常一些线上的服务器不能直接访问,只能先登陆跳板机,再在跳板机上访问线上服务器
  2. 中介行为,买房子一般不会直接去找到房子而是通过中介来找房子
  3. windows的快捷方式

逻辑实现

  1. 有一个接口Linux
  2. 两个实现ServerLinux(服务器)和JumpServerLinux(跳板机)
  3. clientDemo

clientDemo想要登陆服务器,需要登陆跳板机经过验证才能登陆服务器

代码实现

1、 创建基础linux服务器的接口

/**
 * @ClassName Linux
 * @Desc linux机器
 * @Author YangMingYu
 * @Date 2021/10/26 10:46 上午
 * @Version 1.0
 **/
public interface Linux {

    public void play(String name,String password);
    
    //...
}

2、 创建服务器

/**
 * @ClassName ServerLinux
 * @Desc 服务器
 * @Author YangMingYu
 * @Date 2021/10/26 10:46 上午
 * @Version 1.0
 **/
public class ServerLinux implements Linux {


    public void readLog() {
        //查看主机日志信息
        System.out.println("readLog loading...");
        //...
    }

    public void hostName() {
        System.out.println("hostName: " + this.getClass().getName());
    }

    @Override
    public void play(String name, String password) {
        System.out.println("登陆服务器成功");
        checkAuth(name, password);
        hostName();
        readLog();
    }

    public Boolean checkAuth(String name, String password) {
        String reqIp = "10.0.0.1";
        //校验跳转请求的ip是否允许访问

        //再校验名称密码
//        if (checkReqIp(reqIp)) {
//
//        }
        return Boolean.TRUE;
    }
}

3、 创建跳板机

/**
 * @ClassName JumpServerLinux
 * @Desc 跳板机
 * @Author YangMingYu
 * @Date 2021/10/26 10:49 上午
 * @Version 1.0
 **/
public class JumpServerLinux implements Linux {

    ServerLinux serverLinux;


    @Override
    public void play(String name, String password) {
        if (checkAuth(name, password)) {
            jumpToServer("root", "123456");
        }
    }

    public Boolean checkAuth(String name, String password) {
        if ("张三".equals(name) && "123".equals(password)) {
            return true;
        }
        return false;
    }

    public void jumpToServer(String serverName, String serverPass) {
        serverLinux = new ServerLinux();
        serverLinux.play(serverName, serverPass);
    }
}

4、访问服务器

/**
 * @ClassName ClientDemo
 * @Desc 客户端访问server
 * @Author YangMingYu
 * @Date 2021/10/26 10:59 上午
 * @Version 1.0
 **/
public class ClientDemo {

    public static void main(String[] args) {
        Linux linux = new JumpServerLinux();
        linux.play("张三", "123");
    }
}


总结

一般代理商都是在中间做一些使其“简洁”或“增强”的功能

跳板机的概念就是

  1. client只有登陆跳板机的账号密码
  2. 服务器只能允许跳板机的网段访问
  3. 隔离、增强功能的实现