文章目录
  1. 1. 代理模式
    1. 1.1. 代理模式结构图

代理模式

  • 代理模式:为其他对象提供一种代理,以控制对这个对象的访问。
  • 代理应用的场合:

    • 远程代理:也就是为一个对象在不同的地址空间提供局部代理,这样可以隐藏一个对象存在于不同地址空间的事实。
    • 虚拟代理:是根据需要创建很大的对象,通过它来代理来存放实例化需要很长时间的真实对象,例如:网页加载图片。
    • 安全代理:用来控制真实对象访问时的权限,一般用于对象应有不同的访问权限的时候。
    • 智能指引:是指当调用真实对象时,代理处理另外一些事情。
  • 代码:(通过代理去追妹子的例子)

    public interface IGiveGift {
        void GiveDolls();
        void GiveFlowers();
        void GiveChocolate();
    }
    //此类中的@Data用到了lombok的注解,可以自动提供get  set方法,节省代码量
    //请参考“eclipse使用lombok”博客。
    import lombok.Data;
    public @Data class SchoolGirl {
        String name;
    }
    public class Pursuit implements IGiveGift {
        SchoolGirl mm;
        public Pursuit(SchoolGirl mm) {
            super();
            this.mm = mm;
        }
        public Pursuit() {
            super();
        }
        @Override
        public void GiveDolls() {
            // TODO Auto-generated method stub
            System.out.println(mm.getName()+"送你洋娃娃。");
        }
        @Override
        public void GiveFlowers() {
            // TODO Auto-generated method stub
            System.out.println(mm.getName()+"送你鲜花。");
        }
        @Override
        public void GiveChocolate() {
            // TODO Auto-generated method stub
            System.out.println(mm.getName()+"送你巧克力。");
        }
    }
    public class Proxy implements IGiveGift {
        Pursuit gg;
        public Proxy() {
            super();
        }
        public Proxy(SchoolGirl mm) {
            super();
            this.gg = new Pursuit(mm);
        }
        @Override
        public void GiveDolls() {
            // TODO Auto-generated method stub
            gg.GiveDolls();
        }
        @Override
        public void GiveFlowers() {
            // TODO Auto-generated method stub
            gg.GiveFlowers();
        }
        @Override
        public void GiveChocolate() {
            // TODO Auto-generated method stub
            gg.GiveChocolate();
        }
    }
    public class Test {
        public static void main(String[] args) {
            SchoolGirl mm = new SchoolGirl();
            mm.setName("小美");
            Proxy daili = new Proxy(mm);
            daili.GiveDolls();
            daili.GiveFlowers();
            daili.GiveChocolate();
        }
    }
    

代理模式结构图


代理模式结构图
  • Subject接口,定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。

    public interface Subject{
        public void request();
    }
    
  • RealSubject定义Proxy所代表的真实实体,实现了Subject接口。

    public RealSubject implement Subject{
        public void request(){
            //真实请求
        }
    }    
    
  • Proxy类,保存一个实体的引用使得代理可以访问实体,并实现Subject的接口,这样就可以用来代替实体。

    public class Proxy implement Subject{
        RealSubject realSubject;
        public Proxy(){
            realSubject = new RealSubject();
        }
        public void request(){
            realSubject.request();        
        }
    }
    
  • 客户端代码:

    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.request();
    }
    

更多精彩内容,请关注公众号:轮子工厂,公众号内回复:我要造轮子,可免费获得100本计算机经典电子图书; 回复:福利,获取大学生礼包; 回复:加群,邀请您进高手如云技术交流群。

文章目录
  1. 1. 代理模式
    1. 1.1. 代理模式结构图