代理模式
什么是代理模式?
代理模式的定義:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問闰靴。在某些情況下,一個(gè)對(duì)象不適合或者不能直接引用另一個(gè)對(duì)象,而代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用。
通俗的的理解:我們?cè)谧夥孔拥臅r(shí)候回去找中介加矛,為什么呢?因?yàn)槟銓?duì)該地區(qū)房屋的信息掌握的
不夠全面煤篙,希望找一個(gè)更熟悉的人去幫你做斟览,此處的代理就是這個(gè)意思。再如我們有的時(shí)候打
官司辑奈, 我們需要請(qǐng)律師苛茂, 因?yàn)槁蓭熢诜煞矫嬗袑iL(zhǎng), 可以替我們進(jìn)行操作鸠窗, 表達(dá)我們的想法妓羊。
代理模式的結(jié)構(gòu)圖
從上圖我們清楚的可以看出:
- 代理類和委托類分別實(shí)現(xiàn)了接口
- 代理類依賴委托類(說白了就是持有委托類的引用)
代理模式的實(shí)現(xiàn)
為加深印象,下面將以故事的形式將代理模式展現(xiàn)出來.先交代一下背景,有一天,小明同學(xué)(無(wú)辜的小明)想買i7的cpu,但是害怕被宰,所以找到了我(萬(wàn)能的我),讓我?guī)兔θビ憙r(jià)還價(jià).他給了我最高的價(jià)格1500rmb.
下面我們分四步進(jìn)行實(shí)現(xiàn).
- 編寫接口
我們先編寫一個(gè)消費(fèi)者的接口
/**
* 消費(fèi)者
*/
public interface Consumer {
/**
* 購(gòu)物
* @param product 商品
* @param minPrice 賣家給出的最低價(jià)格
*/
boolean shop(String product,int minPrice);
}
- 編寫委托類
其次我們?cè)倬帉慞erson類去實(shí)現(xiàn)消費(fèi)者接口
public class Person implements Consumer {
private String name;
/**商品*/
private String product;
/**能接受的最高價(jià)格*/
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){//賣家給出的最低價(jià)格小于能承受的價(jià)格
System.out.println(name +"花了"+minPrice+"購(gòu)買了" + product);
return true;
}
return false;
}
}
- 編寫代理類
最后們?cè)倬帉懘眍?這也是代理模式的核心,前方高能,大家要坐穩(wěn)了
public class PersonProxy implements Consumer {
private Person person;
/**談判次數(shù)*/
private int bargainingNum=0;
/**討價(jià)還價(jià)后的價(jià)格*/
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)){
//如果給出的價(jià)格小于等于討價(jià)還價(jià)后的價(jià)格就成交
person.shop(product,minPrice);
System.out.println("討價(jià)還價(jià)了"+bargainingNum+"次,"+person.getName() + "和" + name + "開心的走了");
return true;
}
return false;
}
/**
* 討價(jià)還價(jià)
* @param minPrice
*/
private int bargaining(int minPrice) {
switch (bargainingNum) {
case 0:
if ( minPrice<person.getMaxPrice()-500){
System.out.println("價(jià)格合理,成交");
}else {
System.out.println(minPrice+",太貴了請(qǐng)?jiān)诮o出合理的價(jià)格");
}
bargainingPrice=person.getMaxPrice()-500;
break;
case 1:
if ( minPrice<person.getMaxPrice()-300){
System.out.println("價(jià)格合理,成交");
}else {
System.out.println(minPrice+",太貴了請(qǐng)?jiān)诮o出合理的價(jià)格");
}
bargainingPrice=person.getMaxPrice()-300;
break;
case 2:
if ( minPrice<person.getMaxPrice()-200){
System.out.println("價(jià)格合理,成交");
}else {
System.out.println(minPrice+",太貴了請(qǐng)?jiān)诮o出合理的價(jià)格");
}
bargainingPrice=person.getMaxPrice()-200;
break;
case 3:
if ( minPrice<=person.getMaxPrice()){
System.out.println("價(jià)格合理,成交");
bargainingPrice=minPrice;
}else {
System.out.println("不買了!");
}
break;
}
bargainingNum++;
return bargainingPrice;
}
}
4.開始測(cè)試
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()+" ");
}
}
}
測(cè)試結(jié)果:
1700,太貴了請(qǐng)?jiān)诮o出合理的價(jià)格
1600,太貴了請(qǐng)?jiān)诮o出合理的價(jià)格
1500,太貴了請(qǐng)?jiān)诮o出合理的價(jià)格
價(jià)格合理,成交
小明花了1400購(gòu)買了i7cup
討價(jià)還價(jià)了4次,小明和會(huì)理發(fā)的店小二開心的走了
結(jié)語(yǔ):
開個(gè)玩笑,俗話說的好,萬(wàn)變不離其宗,這里兩點(diǎn)要切記,這也是代理模式的核心:
- 代理類和委托類要分別實(shí)現(xiàn)共同接口.
- 代理類要持有委托類的引用.
-
代理類實(shí)現(xiàn)接口方法里要調(diào)用委托類實(shí)現(xiàn)的方法(可以在調(diào)用委托類方法前和后編寫代理類自己的邏輯).
另外本人對(duì)扯蛋有獨(dú)到見解,歡迎前來本人博客扯蛋,我有酒,就差你的故事了