设计模式之代理模式

413 阅读2分钟

概念: 代理模式是指通过代理,不需要去修改实现类,来完成一些额外的功能.生活中比较场景比如找房屋中介,就是很典型的例子.

本文将以"小学僧租房和买房"的例子来畅述什么是代理模式.

分类:

  • 静态代理
  • 动态代理

静态代理

实现类与代理类一一对应原则.

我们知道租房必须要做的事是-签合同.

//定义一个实现类和代理类共同的方法
public interface IHouse {
    void contract();
}

小学僧自己需要参与签合同,我们定义一个实现类.

//实现类,真实对象
public class RealHouser implements  IHouse{


    @Override
    public void contract() {
        System.out.println("签合同");
    }
}

小学僧找到中介了解房屋相关信息,中介代理办理相关事情如联系看房,收取佣金.

//定义一个代理类来代理实现类
public class ProxyHouser implements IHouse {

    private IHouse iHouse;

    public ProxyHouser(IHouse iHouse) {
        this.iHouse = iHouse;
    }

    @Override
    public void contract() {
        before();
        iHouse.contract();
        after();
    }


    private void before() {
        System.out.println("联系看房");
    }


    private void after() {
        System.out.println("收取佣金");
    }
}

最后我们看中介代理租房的结果

public class Main {


    public static void main(String[] args) {
        System.out.println("--------静态代理------");
        RealHouser realHouser = new RealHouser();
        ProxyHouser proxyHouser = new ProxyHouser(realHouser);
        proxyHouser.contract();
       
    }
}

//输出结果
--------静态代理------
联系看房
签合同
收取佣金

租了几年的房后,由于年年涨房租,小学僧决定还是去买房,这时又找到这个中介.
我们知道同一个中介既可以代理租房也可以代理买房.如果按照之前的流程我们还需要定义一个买房的代理类,显然是不科学的.我们需要动态的创建代理类,此时动态代理就派上用场了.

动态代理

运行时通过反射来动态地生成代理对象,并决定代理谁。实现InvocationHandler接口

定义一个负责创建动态代理类

public class DynamicProxyHouser implements InvocationHandler {
    private Object house;//被代理类

    public DynamicProxyHouser(Object house) {
        this.house = house;
    }

    /**
     * @param proxy  实现类
     * @param method 实现类的某个方法
     * @param args   实现类某个方法接受的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        before();
        Object result = method.invoke(house, args);
        after();
        return result;
    }


    private void before() {
        System.out.println("联系看房");
    }


    private void after() {
        System.out.println("收取佣金");
    }
}

最后我们看中介代理买房的结果

public class Main {


    public static void main(String[] args) {
        System.out.println("--------动态代理-------");

        RealHouser realHouser1 = new RealHouser();
        //创建一个买房的动态代理类,该代理实现了IHouse接口
        /**
         * 第一个参数:实现类的classLoader
         * 第二个参数:代理对象需要实现的接口class
         */
        IHouse iHouseProxy = (IHouse) Proxy.newProxyInstance(realHouser1.getClass().getClassLoader(),
                new Class[]{IHouse.class}, new DynamicProxyHouser(realHouser1));
        iHouseProxy.contract();
    }
}

//输出结果
--------动态代理-------
联系看房
签合同
收取佣金

这样该中介就可以不管谁来买房或者租房,他都能代理顾客了.

由于本人技术有限,如有错误的地方,麻烦大家给我提出来,本人不胜感激,大家一起学习进步.