• 设计模式之 代理模式


    概述:

      代理模式(Proxy Pattern),23种常用的面向对象软件的设计模式之一。为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

    组成:

      抽象角色,一般是接口,声明具体业务方法

      代理角色,实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

      真是角色(目标角色),实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

    案例:

    场景:你想租房子,但是找不到房子的房东,这时候通过中介来租房东的房子。

    房东信息:

    /**
     * 房东类
     */
    public class Landlord {
        private String name;
    
        public Landlord(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

    首先定义租赁的接口:

    /**
     * 租赁接口
     */
    public interface Renting {
        public void rentingHouse();
    }

    然后是租客和中介,都需要实现租赁接口

    租客(目标角色):

    /**
     * 租客类(目标类,被代理类)
     */
    public class Tenant implements Renting {
    
        Landlord landlord;
    
        public Tenant(Landlord landlord) {
            this.landlord = landlord;
        }
    
        @Override
        public void rentingHouse() {
            System.out.println(landlord.getName() + ",我要租你的房子...");
        }
    }

    中介(代理角色):

    /**
     * 中介代理类
     */
    public class IntermediaryProxy implements Renting {
    
        Tenant tenant;
    
        public IntermediaryProxy(Landlord landlord) {
            tenant = new Tenant(landlord);
        }
    
        @Override
        public void rentingHouse() {
            System.out.println("中介为你服务...");
            tenant.rentingHouse();
        }
    }

    租赁行为(测试代码):

    public class ClientClass {
        public static void main(String[] args) {
            Landlord landlord = new Landlord("张学友");
            IntermediaryProxy proxy = new IntermediaryProxy(landlord);
            proxy.rentingHouse();;
        }
    }

    可以看出我们的代码中,并没有出现租客的信息,因为他把租房子的行为全权让中介代理了,这也就是所说的 代理拥有目标的绝对控制权。

    运行结果:

    其实不难看出,代理模式和装饰模式很相似,个人理解是代理模式中,代理类对被代理的对象有控制权,决定其执行或者不执行。而装饰模式中,装饰类对代理对象没有控制权,只能为其增加一层装饰,以加强被装饰对象的功能,就这样。

  • 相关阅读:
    jquery冲突细节
    最懂中文的H5前端框架amazeUI
    IT Girl
    json_encode注意
    YII2 Activedataprovider 类分页的使用
    Yii框架,在页面输出执行sql语句,方便调试
    yii2的GridView和ActiveDataProvider具体使用
    文件压缩工具类
    将dubbo中使用的动态代理作为工具类
    spring中使用动态代理(AOP)
  • 原文地址:https://www.cnblogs.com/blazeZzz/p/9311319.html
Copyright © 2020-2023  润新知