代理模式
什么是代理模式?
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
通俗的的理解:我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的
不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。再如我们有的时候打
官司, 我们需要请律师, 因为律师在法律方面有专长, 可以替我们进行操作, 表达我们的想法。
代理模式的结构图
从上图我们清楚的可以看出:
- 代理类和委托类分别实现了接口
- 代理类依赖委托类(说白了就是持有委托类的引用)
代理模式的实现
为加深印象,下面将以故事的形式将代理模式展现出来.先交代一下背景,有一天,小明同学(无辜的小明)想买i7的cpu,但是害怕被宰,所以找到了我(万能的我),让我帮忙去讨价还价.他给了我最高的价格1500rmb.
下面我们分四步进行实现.
- 编写接口
我们先编写一个消费者的接口
/**
* 消费者
*/
public interface Consumer {
/**
* 购物
* @param product 商品
* @param minPrice 卖家给出的最低价格
*/
boolean shop(String product,int minPrice);
}
- 编写委托类
其次我们再编写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;
}
}
- 编写代理类
最后们再编写代理类,这也是代理模式的核心,前方高能,大家要坐稳了
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次,小明和会理发的店小二开心的走了
结语:
开个玩笑,俗话说的好,万变不离其宗,这里两点要切记,这也是代理模式的核心:
- 代理类和委托类要分别实现共同接口.
- 代理类要持有委托类的引用.
-
代理类实现接口方法里要调用委托类实现的方法(可以在调用委托类方法前和后编写代理类自己的逻辑).
另外本人对扯蛋有独到见解,欢迎前来本人博客扯蛋,我有酒,就差你的故事了