设计模式--代理模式

代理模式:

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

组成:

  •  抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
  • 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作,对真实角色加以控制。
  • 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

优点:

  • 职责明确:真实角色可以只做业务逻辑,其他控制可以用代理类完成
  • 保护和控制真实角色:代理类作为调用者和真实角色的中介,可以有效的保护和控制真实角色。
  • 容易控制:可以扩展不同的代理类,实现不同的目的,不需要修改真实角色的业务类。

缺点:

  增加复杂度,多一个中介,降低速度

类图:

应用例子:

比如,你想追求一个女孩子,送礼物给她,但是你要先搞定她的闺蜜,闺蜜就相当于你的代理,闺蜜还可以看你表现控制是否送礼物给她。

下面是实现代码:

例子代码:

public class Girl {
    private String name;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public interface GiveGift {
    void giveFlower(Girl girl);
    void giveDolls(Girl girl);

}
public class Suitor implements GiveGift {
    @Override
    public void giveFlower(Girl girl) {
        System.out.println("送给"+girl.getName()+"一朵花!");
    }

    @Override
    public void giveDolls(Girl girl) {
        System.out.println("送给"+girl.getName()+"一个洋娃娃!");
    }
}
public class Proxy implements GiveGift {
    /**
     * 追求者
     */
    private Suitor suitor = new Suitor();

    @Override
    public void giveFlower(Girl girl) {
        if(new Random().nextBoolean()){
            suitor.giveFlower(girl);
        }
    }

    @Override
    public void giveDolls(Girl girl) {
        suitor.giveDolls(girl);
    }
}
public class Test {
    public static void main(String[] args) {
        Girl girl = new Girl("坨坨");
        GiveGift proxy = new Proxy();
        proxy.giveFlower(girl);
        proxy.giveDolls(girl);
    }
}

最终效果:

原文地址:https://www.cnblogs.com/foreverYoungCoder/p/7804502.html