设计模式-代理模式学习笔记

前言:不包含动态代理

代理模式

代理模式为其他对象提供一种代理以控制对这个对象的访问。(代理类替代具体的实现类,代理类可根据需求添加内容而不用修改实现类)


 

  • 优缺点

优点:

  1. 满足了开闭原则
  2. 可扩展性高(当需求添加内容可通过代理类添加)
  3. 保护了实现类(可以隐藏并且不用修改),也增强了实现类的功能

缺点:

  1. 在实现类和调用类之间出现代理类,影响请求速度
  2. 类的数量增加,程序变得复杂

 

  • 结构

Subject:代理类和实现类的父类

RealSubject:具体的实现类,被代理对象

Proxy:代理类(代理对象,调用时被调用的对象)


 

  • 代码

引用《大话设计模式》中的例子,为人做嫁衣,一位同学想追求李娇娇同学,但是由于含羞,所以请另一位同学代为送礼物

    抽出父类

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/13 5:11
 * @ Description:代理和被代理对象的共同父类
 */
public interface GiveGift {
    void giveDolls();
    void giveFlowers();
    void giveChocolate();
}

    女孩类

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/13 5:08
 * @ Description:女孩
 */
public class SchoolGirl {
    private String name;

    public String getName() {
        return name;
    }

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

 被代理对象,实现具体的操作

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/13 5:08
 * @ Description:被代理类  追求者类
 */
public class Pursuit implements GiveGift{
    SchoolGirl mm;

    public Pursuit(SchoolGirl mm){
        this.mm = mm;
    }

    @Override
    public void giveDolls() {
        System.out.println(mm.getName()+"送你洋娃娃");
    }

    @Override
    public void giveFlowers() { System.out.println(mm.getName()+"送你鲜花");
    }

    @Override
    public void giveChocolate() {
        System.out.println(mm.getName()+"送你巧克力");
    }
}

 代理对象,调用被代理对象的操作,并且可以提供增强的操作 

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/13 5:12
 * @ Description:代理类
 */
public class Proxy implements GiveGift{
    Pursuit pursuit;

    public Proxy(SchoolGirl mm){
        pursuit = new Pursuit(mm);
    }

    @Override
    public void giveDolls() { pursuit.giveDolls();
    }

    @Override
    public void giveFlowers() { pursuit.giveFlowers();
    }

    @Override
    public void giveChocolate() {
        pursuit.giveChocolate();
    }

    //代理对象新增的操作
    public void giveBook(){
        System.out.println("送书");
    }
}

  

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/13 5:15
 * @ Description:客户端调用类
 */
public class TestController {
    public void print(){
        SchoolGirl mm = new SchoolGirl();
        mm.setName("李娇娇");

        Proxy proxy = new Proxy(mm);
        proxy.giveDolls();
        proxy.giveChocolate();
        proxy.giveFlowers();
        proxy.giveBook();
    }
}

  


 

  • 总结

代理模式可以让具体的操作对象被隐藏,并且可以在不修改操作对象的情况下扩展它的功能。

posted @ 2019-05-14 01:04  fonxi  阅读(104)  评论(0编辑  收藏  举报