当前位置: 移动技术网 > 移动技术>手机>小米 > 代理模式

代理模式

2020年11月09日  | 移动技术网移动技术  | 我要评论
一.小结定义:为其它对象提供一种代理以控制对这个对象的访问。特点:职责清晰、高扩展性、智能化;由于在客户端和真实对象之间增加了代理角色,可能造成请求变慢。实现代理模式需要额外的工作,有些代理模式的实现非常复杂。分类:根据是否已知具体的契约(接口)分为动态代理和静态代理,根据是否指定特定的代理角色分为强制代理和普通代理。通用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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网