设计模式-代理模式

这次主要记录下代理模式的学习过程


一、什么是代理模式

  • 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问
  • 优点:
    • 职责清晰,目标对象只需要关注自己本身的业务逻辑即可,而无需关注其他非本职责的事务
    • 高扩展性,可以根据需求动态地添加代理对象,而无需更改原有的代码,符合开闭原则
  • 缺点:
    • 实现代理模式,需要额外的工作
    • 代理类过多,会导致程序变得复杂

二、代理模式UML图

在这里插入图片描述


三、代理模式示例

送礼物抽象类
即Subject类 (抽象实体类),定义了RealSubject类和Proxy类的共用接口

/**
 * @Title: SendGifts.java
 * @Description: 送礼物抽象类
 * @Author: xj
 * @Date: 2018/9/26 23:15
 */
public abstract class SendGifts {

    public abstract void sendFlower();

    public abstract void sendMilk();

    public abstract void sendChocolate();
}

被追求者类

/**
 * @Title: PrettyGirl.java
 * @Description: 被追求者
 * @Author: xj
 * @Date: 2018/9/26 23:20
 */
public class PrettyGirl {

    private String name;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

追求者类
即RealSubject类 (真实实体类),是Proxy类所代表的真实实体

/**
 * @Title: Pursuer.java
 * @Description: 追求者类
 * @Author: xj
 * @Date: 2018/9/26 23:19
 */
public class Pursuer extends SendGifts {

    private PrettyGirl prettyGirl;

    public Pursuer(PrettyGirl prettyGirl) {
        this.prettyGirl = prettyGirl;
    }

    @Override
    public void sendFlower() {
        System.out.println(prettyGirl.getName() + ": 送你鲜花!");
    }

    @Override
    public void sendMilk() {
        System.out.println(prettyGirl.getName() + ": 送你牛奶!");
    }

    @Override
    public void sendChocolate() {
        System.out.println(prettyGirl.getName() + ": 送你巧克力!");
    }
}

代理类
持有一个对真实实体的引用,在其方法中调用真实实体类中对应的方法,从而起到代理的作用

/**
 * @Title: Proxy.java
 * @Description: 代理类
 * @Author: xj
 * @Date: 2018/9/26 23:26
 */
public class Proxy extends SendGifts {

    private Pursuer pursuer;

    public Proxy(PrettyGirl prettyGirl) {
        this.pursuer = new Pursuer(prettyGirl);
    }

    @Override
    public void sendFlower() {
        pursuer.sendFlower();
    }

    @Override
    public void sendMilk() {
        pursuer.sendMilk();
    }

    @Override
    public void sendChocolate() {
        pursuer.sendChocolate();
    }
}

测试类

/**
 * @Title: Test.java
 * @Description: 测试类
 * @Author: xj
 * @Date: 2018/9/26 23:29
 */
public class Test {

    public static void main(String[] args) {
        PrettyGirl prettyGirl = new PrettyGirl("小白");
        Proxy proxy = new Proxy(prettyGirl);
        proxy.sendFlower();
        proxy.sendMilk();
        proxy.sendChocolate();
    }
}

输出结果
在这里插入图片描述


以上就是抽象工厂模式的一个小例子

posted @ 2018-10-11 23:26  GeneXu  阅读(58)  评论(0)    收藏  举报