生活中的代理模式

作者: 会理发的店小二 | 来源:发表于2017-05-02 19:18 被阅读0次

代理模式

什么是代理模式?

代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
通俗的的理解:我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的
不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。再如我们有的时候打
官司, 我们需要请律师, 因为律师在法律方面有专长, 可以替我们进行操作, 表达我们的想法。

代理模式的结构图

代理模式.png

从上图我们清楚的可以看出:

  1. 代理类委托类分别实现了接口
  2. 代理类依赖委托类(说白了就是持有委托类的引用)

代理模式的实现

为加深印象,下面将以故事的形式将代理模式展现出来.先交代一下背景,有一天,小明同学(无辜的小明)想买i7的cpu,但是害怕被宰,所以找到了我(万能的我),让我帮忙去讨价还价.他给了我最高的价格1500rmb.
下面我们分四步进行实现.

  1. 编写接口
    我们先编写一个消费者的接口
/**
 * 消费者
 */
public interface Consumer {
    /**
     * 购物
     * @param product 商品
     * @param minPrice 卖家给出的最低价格
     */
    boolean shop(String product,int minPrice);
}
  1. 编写委托类
    其次我们再编写Person类去实现消费者接口
public class Person implements Consumer {
    private String name;
    /**商品*/
    private String product;
    /**能接受的最高价格*/
    private int maxPrice;

    public Person(String name, String product, int maxPrice) {
        this.name = name;
        this.product = product;
        this.maxPrice = maxPrice;
    }

    public String getName() {
        return name;
    }

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

    public String getProduct() {
        return product;
    }

    public void setProduct(String product) {
        this.product = product;
    }

    public void setMaxPrice(int maxPrice) {
        this.maxPrice = maxPrice;
    }

    public int getMaxPrice() {
        return maxPrice;
    }

    @Override
    public boolean shop(String product, int minPrice) {
        if (minPrice<=maxPrice){//卖家给出的最低价格小于能承受的价格
            System.out.println(name +"花了"+minPrice+"购买了" + product);
            return true;
        }

        return false;
    }
}
  1. 编写代理类
    最后们再编写代理类,这也是代理模式的核心,前方高能,大家要坐稳了
public class PersonProxy implements Consumer {

    private Person person;
    /**谈判次数*/
    private int bargainingNum=0;
    /**讨价还价后的价格*/
    private int bargainingPrice = 0;
    private String name;

    public PersonProxy(Person person, String name) {
        this.person = person;
        this.name = name;
    }

    @Override
    public boolean shop(String product, int minPrice) {
       if (minPrice<=bargaining(minPrice)){
           //如果给出的价格小于等于讨价还价后的价格就成交
           person.shop(product,minPrice);
           System.out.println("讨价还价了"+bargainingNum+"次,"+person.getName() + "和" + name + "开心的走了");
           return true;
       }

        return false;
    }

    /**
     * 讨价还价
     * @param minPrice
     */
    private int bargaining(int minPrice) {

        switch (bargainingNum) {
            case 0:
               if ( minPrice<person.getMaxPrice()-500){
                   System.out.println("价格合理,成交");
               }else {
                    System.out.println(minPrice+",太贵了请在给出合理的价格");
               }
                bargainingPrice=person.getMaxPrice()-500;
                break;
            case 1:
                if ( minPrice<person.getMaxPrice()-300){
                    System.out.println("价格合理,成交");

                }else {
                     System.out.println(minPrice+",太贵了请在给出合理的价格");
                }
                bargainingPrice=person.getMaxPrice()-300;
                break;

            case 2:
                if ( minPrice<person.getMaxPrice()-200){
                    System.out.println("价格合理,成交");

                }else {
                     System.out.println(minPrice+",太贵了请在给出合理的价格");
                }
                bargainingPrice=person.getMaxPrice()-200;
                break;
            case 3:
                if ( minPrice<=person.getMaxPrice()){
                    System.out.println("价格合理,成交");
                    bargainingPrice=minPrice;
                }else {
                    System.out.println("不买了!");
                }
                break;
        }

        bargainingNum++;
        return bargainingPrice;
    }
}

4.开始测试

public class Test {
    public static void main(String[] args) {
        Collection collection=new MyCollection();
        Iterator iterator=new MyIterator(collection);

        while (iterator.hasNext()) {
            System.out.print(iterator.next()+" ");
        }
    }
}

测试结果:

1700,太贵了请在给出合理的价格
1600,太贵了请在给出合理的价格
1500,太贵了请在给出合理的价格
价格合理,成交
小明花了1400购买了i7cup
讨价还价了4次,小明和会理发的店小二开心的走了

结语:

写个屁代码.jpg

开个玩笑,俗话说的好,万变不离其宗,这里两点要切记,这也是代理模式的核心:

  1. 代理类和委托类要分别实现共同接口.
  2. 代理类要持有委托类的引用.
  3. 代理类实现接口方法里要调用委托类实现的方法(可以在调用委托类方法前和后编写代理类自己的逻辑).
    另外本人对扯蛋有独到见解,欢迎前来本人博客扯蛋,我有酒,就差你的故事了

相关文章

  • 初识代理模式

    代理模式介绍 代理模式(Proxy Pattern)也称为委托模式。 我们生活中处处都有代理模式的影子。对于程序员...

  • 设计模式(六)代理模式

    1.代理模式简介 代理模式介绍 代理模式也叫委托模式,是结构型设计模式的一种。在现实生活中我们用到类似代理模式的场...

  • 设计模式 ② — 结构型模式

    代理模式(PROXY) 介绍: 代理模式也叫委托模式,日常生活中我们接触的最常见的就是代理上网。 定义: 为其他对...

  • 设计模式之代理模式

    代理模式 给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。 代理模式通俗的来讲代理模式就是我们生活中...

  • Java反射与动态代理

    代理模式 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活 中...

  • 谈谈设计模式之代理模式及关于动态代理的实现原理

    代理模式又细分为动态代理、静态代理、远程代理等等。举个生活中的例子进行类比,代理模式类似与现在流行的代购,客户想获...

  • 还为那些设计模式烦恼吗-代理模式

    代理模式 介绍 代理模式也称委托模式。何谓代理模式?其实代理在我们日常生活中也并不少见,舍友叫你帮他买外卖也是一种...

  • 14 Android常见设计模式:代理模式

    前言 代理模式(Proxy Pattern)也称为委托模式。那么代理模式是啥呢?其实代理在我们日常生活中也并不少见...

  • 生活中的代理模式

    代理模式 什么是代理模式? 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不...

  • Java设计模式之代理模式

    前言 代理模式也被称为委托模式,它是结构型设计模式的一种。在现实生活中我们用到类似代理模式的场景有很多,比如代理上...

网友评论

    本文标题:生活中的代理模式

    本文链接:https://www.haomeiwen.com/subject/sclhtxtx.html