代理模式-Java设计模式(五)

209 阅读2分钟

** 2019-12-05 17:45:11 **

代理模式-Java设计模式(五)

代理模式

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

何时使用

想在访问一个类时做一些控制。

如何解决

增加中间层。

关键代码

实现与被代理类组合。

优缺点

优点:1、职责清晰。 2、高扩展性。 3、智能化。 缺点:1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外

使用场景

按职责来划分,通常有以下使用场景: 1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。

注意事项

1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

代码 & 结构图

小明想托我帮他送礼物给女神。

【送礼物】接口

/**
 * 送礼物接口
 */
public interface Gifts {
    /**
     * 送花
     */
    void flower();

    /**
     * 送巧克力
     */
    void chocolate();
}

【女神类】

/**
 * 女神
 */
@Data
public class Girl {
    // 名称
    private String name;
}

【小明类】

/**
 * 小明想送礼物给 女神
 * 实现了送礼物接口
 */
public class XiaoMing implements Gifts {

    private Girl girl;

    XiaoMing(Girl girl) {
        this.girl = girl;
    }

    @Override
    public void flower() {
        System.out.println(girl.getName() + ",送你花花~");
    }

    @Override
    public void chocolate() {
        System.out.println(girl.getName() + ",送你巧克力~");
    }
}

【代理类】相当于我

/**
 * 代理类,相当于我,帮小明送
 * 实现了送礼物接口
 */
public class Proxy implements Gifts {

    private XiaoMing xiaoMing;

    // !!!注意!!!new小明,带入女神
    Proxy(Girl girl) {
        this.xiaoMing = new XiaoMing(girl);
    }

    // 调用小明送礼物方法
    @Override
    public void flower() {
        xiaoMing.flower();
    }

    @Override
    public void chocolate() {
        xiaoMing.chocolate();
    }

}

测试

/**
 * 测试
 */
public class Test {
    public static void main(String[] args) {
        Girl girl = new Girl();
        girl.setName("红红");

        Proxy proxy = new Proxy(girl);

        proxy.flower(); // 红红,送你花花~
        
        proxy.chocolate(); // 红红,送你巧克力~
    }
}

UML结构图

源码 - proxy分支

不同分支对应不同设计模式源码 github.com/nullaman/Ja…