Java设计模式----代理模式(托孤寄命)

人走茶凉 提交于 2020-02-28 03:14:11

定义

Proxy是代理人的意思,指的是代替别人进行工作的人。当不一定需要本人亲自去做的工作的时候,就可以寻找代理人去完成。
但在代理模式中,往往是相反的,通常是代理人碰到工作,就交给被代理的对象去完成,代理人只完成一些准备工作或者收尾工作。

目的

1 通过引入代理对象的方式来间接访问目标对象 防止直接访问目标对象堆系统带来不必要的复杂性
2 通过代理对象对原有的业务加强

要素

委托对象 	(快递店)
代理类		(跑腿业务员)
客户类		(点跑腿业务的人)

静态代理模式

UML类图

在这里插入图片描述

委托的抽象对象(快递店)

public interface Shop {

    void makeFood(String size);

}

实现

public class ShopImpl implements Shop {
    @Override
    public void makeFood(String size) {
        System.out.println("给你制作了一个" + size + "的食物");
    }
}

跑腿业务员

public class Sender implements Shop {

    private Shop shop;

    public Sender(Shop shop) {
        this.shop = shop;
    }

    @Override
    public void makeFood(String size) {
        doSomethingBefore();
        shop.makeFood(size);
        doSomethingAfter();
    }
	//业务加强  让用户知道送餐情况
    private void doSomethingBefore() {
        System.out.println("跑腿小哥正在取");
    }
	//业务加强  让用户知道送餐情况
    private void doSomethingAfter() {
        System.out.println("跑腿小哥取回来了");
    }

}

用户类

public class Test {

    public static void main(String[] args) {
        Shop shop = new ShopImpl();
        Sender sender = new Sender(shop);
        //用户只用告诉跑腿小哥是一个大号的物品 跑腿小哥可以取回来
        sender.makeFood("大号");
    }
}

快递小哥正在取餐
给你制作了一个大号的食物
快递小哥送到了请签收

以上便是静态代理模式,但是Sender类的扩展性就很差,可维护性也很差. 如果不知道物品大小了 但现在不需要提供大小而是需要提供身份证了 那就无法维护了 这便是静态代理的弊端

动态代理模式

UML类图

在这里插入图片描述
场景:买票

代理对象

public interface Buyer {

    void login(String username, String password);

    void  buyTickt();
}
---------------------------------------------

public class BuyerImpl implements Buyer {

    private String name;

    public BuyerImpl(String name) {
        this.name = name;
    }

    @Override
    public void login(String username, String password) {
        System.out.println("用户名:"+username+"-----密码:"+password);
    }

    @Override
    public void buyTickt() {
        System.out.println(name + "正在购票");
    }
}

代理类

public class BuyerProxy implements Buyer {

    private Buyer buyer;

    public BuyerProxy(Buyer buyer) {
        this.buyer = buyer;
    }

    @Override
    public void login(String username, String password) {
        this.buyer.login(username, password);
    }

    @Override
    public void buyTickt() {
        doSomethingBefore();
        this.buyer.buyTickt();
        doSomethingAfter();
    }

    private void doSomethingBefore() {
        System.out.println("开始出票");
    }

    private void doSomethingAfter() {
        System.out.println("出票成功");
    }

}

测试

public class Test {

    public static void main(String[] args) {
        Buyer buyer = new BuyerImpl("cy");

        Buyer proxy = (Buyer) Proxy.newProxyInstance(BuyerImpl.class.getClassLoader(), BuyerImpl.class.getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object o;
                if ("buyTickt".equals(method.getName())) {
                    System.out.println("invoke start");
                    o = method.invoke(buyer, args);
                    System.out.println("invoke finish");
                } else {
                    o = method.invoke(buyer, args);
                }
                return o;
            }
        });

        proxy.login("cy", "123");
        proxy.buyTickt();
    }
}

用户名:cy-----密码:123
invoke start
cy正在购票
invoke finish
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!