Java设计模式之代理模式

模式介绍

代理模式为其他对象提供一种代理以控制对这个对象的访问。

应用场景

生活中有很多代理模式的例子,例如你有房要出售,就会找中介帮忙把你的房子出售,这个过程中介就是代理。

代码例子

下面使用一个中介帮人出售房屋的demo来模拟代理模式。
uml 图
这里写图片描述

静态代理

房屋出售接口

/**
 * 房屋出售
 */
public interface SellHouse {


    /**
     * 发布出售内容
     */
    public void publish();

    /**
     * 联系客户
     */
    public void contactCustomer();

    /**
     * 带客户看房
     */
    public void seeHouse();

    /**
     * 签约
     */
    public void sign();

    /**
     * 卖房
     */
    public void sell();
}

房东类

/**
 * 房东
 */
public class Fangdong implements SellHouse {


    @Override
    public void publish() {
        System.out.println("发布房屋出售消息");
    }

    @Override
    public void contactCustomer() {
        System.out.println("联系客户");
    }

    @Override
    public void seeHouse() {
        System.out.println("带客户看房");
    }

    @Override
    public void sign() {
        System.out.println("签约");
    }

    @Override
    public void sell() {
        System.out.println("卖房");
    }
}

中介类

/**
 * 房屋出售
 */
public interface SellHouse {


    /**
     * 发布出售内容
     */
    public void publish();

    /**
     * 联系客户
     */
    public void contactCustomer();

    /**
     * 带客户看房
     */
    public void seeHouse();

    /**
     * 签约
     */
    public void sign();

    /**
     * 卖房
     */
    public void sell();
}

Main

/**
 * 代理模式-静态代理
 */
public class Main {

    public static void main(String args[]){
        //房东
        Fangdong f = new Fangdong();
        //中介
        Zhongjie zhongjie = new Zhongjie(f);
        //房屋消息
        zhongjie.publish();
        //联系客户
        zhongjie.contactCustomer();
        //带客户看房
        zhongjie.seeHouse();
        //签约
        zhongjie.sign();
        //交房
        zhongjie.sell();
    }
}
动态代理

通过反射机制动态生成代理者的对象,java给我们提供了一个便捷的动态代理接口InvocationHandler。

DynamicProxy
定义一个DynamicProxy类实现InvocationHandler

/**
 * 动态代理类
 */
public class DynamicProxy implements InvocationHandler{

    private Object object;

    public DynamicProxy(Object object){
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result;
        //调用被代理类对象的方法
        result = method.invoke(object,args);
        return result;

    }
}

Main2

/**
 * 代理模式-动态代理
 */
public class Main2 {

    public static void main(String args[]){

        //房东
        Fangdong fangdong = new Fangdong();
        //动态代理
        DynamicProxy proxy = new DynamicProxy(fangdong);
        //动态构建一个代理
        SellHouse sellHouse = (SellHouse) Proxy.newProxyInstance(fangdong.getClass().getClassLoader(),fangdong.getClass().getInterfaces(),proxy);
        //发布
        sellHouse.publish();
        //联系客户
        sellHouse.contactCustomer();
        //带人看房
        sellHouse.seeHouse();
        //签约
        sellHouse.sign();
        //卖房
        sellHouse.sell();
    }
}

打印

发布房屋出售消息
联系客户
带客户看房
签约
卖房
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值