欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

代理模式

程序员文章站 2022-04-20 08:29:12
一.小结定义:为其它对象提供一种代理以控制对这个对象的访问。特点:职责清晰、高扩展性、智能化;由于在客户端和真实对象之间增加了代理角色,可能造成请求变慢。实现代理模式需要额外的工作,有些代理模式的实现非常复杂。分类:根据是否已知具体的契约(接口)分为动态代理和静态代理,根据是否指定特定的代理角色分为强制代理和普通代理。通用UML类图举例:小米手机的饥饿营销,每当小米手机新品发布后,一般需要抢购,米粉(真实角色)很难第一时间抢到,只能找黄牛(代理角色)加价购买。(以上仅供举例,...

一.小结

  • 定义:为其它对象提供一种代理以控制对这个对象的访问。

  • 特点:职责清晰、高扩展性、智能化;由于在客户端和真实对象之间增加了代理角色,可能造成请求变慢。实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

  • 分类:根据是否已知具体的契约(接口)分为动态代理和静态代理,根据是否指定特定的代理角色分为强制代理和普通代理。

  • 通用UML类图
    代理模式

  • 举例:小米手机的饥饿营销,每当小米手机新品发布后,一般需要抢购,米粉(真实角色)很难第一时间抢到,只能找黄牛(代理角色)加价购买。(以上仅供举例,如有不适待删除)。

二.普通代理

// 真实对象与代理角色的契约
public interface IMiPhone {
    void buy();
}

// 被代理的对象(真实对象)
public class MiFan implements IMiPhone {

    @Override
    public void buy() {
        System.out.println("完全抢不到啊,吼吼吼");
    }
}
// 代理角色
public class Scalper implements IMiPhone {

    private IMiPhone miFan;

    public Scalper() {
        this(new MiFan());
    }

    private Scalper(IMiPhone miFan) {
        this.miFan = miFan;
    }

    @Override
    public void buy() {
        miFan.buy();
        addMoney();
        System.out.println("给你买个红米K30s至尊纪念版");
    }
	// 代理商的私有方法
    private void addMoney() {
        System.out.println("加价300!");
    }
    // 代理商的私有方法
    private void ad(){
        System.out.println("我的QQ是6666,下次找我更优惠哈");
    }
}
// 情景类
public class Client {
    public static void main(String[] args) {
        Scalper scalper = new Scalper();
        scalper.buy();
    }
}

三.强制代理

// 真实对象与代理角色的契约, 增加一个获取代理的方法
public interface IMiPhone {
    void buy();

    IMiPhone getProxy();
}

// 被代理的对象(真实对象),只能通过getProxy()指定自己的代理
public class MiFan implements IMiPhone {

    private Scalper scalper;
	
    @Override
    public void buy() {
        if (hasProxy()) {
            System.out.println("加价300!");
            System.out.println("给你买个红米K30s至尊纪念版");
        } else {
            System.out.println("自己完全抢不到啊,吼吼吼");
            System.out.println("找黄牛吧,呜呜呜~~");
        }
    }

    @Override
    public IMiPhone getProxy() {
        scalper = new Scalper(this);
        return scalper;
    }

    private boolean hasProxy() {
        return scalper != null;
    }
}
// 代理角色
public class Scalper implements IMiPhone {

    private IMiPhone miFan;

    public Scalper(IMiPhone miFan) {
        this.miFan = miFan;
    }

    @Override
    public void buy() {
        miFan.buy();
    }

    @Override
    public IMiPhone getProxy() {
        return this;
    }
    
}

// 情景类
public class Client {
    public static void main(String[] args) {
        MiFan miFan = new MiFan();
        miFan.getProxy().buy();
    }
}

四.动态代理

// 已知的角色
public class Scalper {
    public void buyEasy() {
        System.out.println("我是黄牛,太舒服了啊");
    }
}
// 要代理的接口
public interface IMiPhone {
    void buy();
}

// 具体的实现类,当黄牛的小米粉丝
public class MiFan extends Scalper implements IMiPhone {

    @Override
    public void buy() {
        System.out.println("完全抢不到啊,吼吼吼");
    }
}
// 实现代理实例的接口
public class MyInvocationHandler implements InvocationHandler {

    private Object target;

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(target, args);
    }
}

// 情景类
public class Client {
    public static void main(String[] args) {
        Scalper scalper =  new MiFan();
        // scalper.buyEasy();
        // 生成真实角色
        IMiPhone proxy = (IMiPhone) Proxy.newProxyInstance(scalper.getClass().getClassLoader(),
                scalper.getClass().getInterfaces(),
                new MyInvocationHandler(scalper));
        proxy.buy();

    }
}

本文地址:https://blog.csdn.net/wangadping/article/details/109588790

相关标签: 设计模式 java