您的位置:首页 > 其它

设计模式之代理模式02

2016-09-18 11:50 176 查看

设计模式之代理模式02

介绍

什么是代理模式?我很忙,忙得没空理你,那你要找就先找我的代理人吧,那代理人总要知道被代理人能做不能做哪些事吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理的人能干活啊。

比如西门庆,潘金莲,那潘金莲不好意思答复啊,咋办,找王婆做个代理,

实现

先定义一种女人类型,王婆和潘金莲都属于这个类型

/**
* 定义一种女人类型,王婆和潘金莲都属于这种类型
* @author chenlisong
*
*/
public interface KindWomen {

//抛媚眼
public void makeEyesWithMan();

//make happy? u know.
public void makeHappy();

}


定义潘金莲

public class PanJinLian implements KindWomen {

public void makeEyesWithMan() {
System.out.println("潘金莲在抛媚眼");

}

public void makeHappy() {
System.out.println("潘金莲在和男人做那个");
}

}


定义一个丑陋的王婆

public class WangPo implements KindWomen{

private KindWomen kindWomen;

//王婆代理别的女人
public WangPo (KindWomen kindWomen) {
this.kindWomen = kindWomen;
}

//王婆年龄大,代理别人抛媚眼
public void makeEyesWithMan() {
this.kindWomen.makeEyesWithMan();
}

//王婆年龄大,找年轻的代替之
public void makeHappy() {
this.kindWomen.makeHappy();
}

}


西门庆的姘头2

public class JiaShi implements KindWomen{

public void makeEyesWithMan() {
System.out.println("贾氏在抛媚眼");

}

public void makeHappy() {
System.out.println("贾氏在和男人做那个");
}

}


男主角上场之

public class XiMenQing {

/**
*  水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道,痴迷了,
*  被王婆看到了, 就开始撮合两人好事,王婆作为潘金莲的代理人
*  收了不少好处费,那我们假设一下:
*  如果没有王婆在中间牵线,这两个不要脸的能成吗?难说的很!
* @param args
*/
public static void main(String[] args) {
PanJinLian pjl = new PanJinLian();

//把王婆叫出来
WangPo wangPo = new WangPo(pjl);

//然后西门庆就说,我要和潘金莲happy,然后王婆就安排了西门庆丢筷子的那出戏:
wangPo.makeEyesWithMan(); //看到没,虽然表面上时王婆在做,实际上爽的是潘金莲
wangPo.makeHappy();

//西门庆要换个妹子,换成贾氏
JiaShi js = new JiaShi();
wangPo = new WangPo(js); //让王婆作为贾氏的代理人
wangPo.makeEyesWithMan();
wangPo.makeHappy();

}

}


代理模式和策略模式的区别

代理模式

代理模式中,代理类知道被代理类的行为,因为代理类与被代理类实现的是同一个接口,因此代理类与被代理类的结构是相同的

代理模式主要针对对象的访问控制,比如在hibernate的懒加载中,不希望页面直接访问dao层的数据,这时候给页面开放一个Proxy。

策略模式

而策略模式中,策略容器并不知道内部策略的详细信息,因为容器并没有实现与内部策略相同的接口,即容器与内部策略只是简单的组合关系,容器只是将内部策略的行为抽取出来,进行了统一的实现。

策略模式在项目中适用于实现一个目标但是有很多不同的做法的情况,比如实现数据库里面的搜索,可能算法,方式很多,但是目的差不多。这时可以使用策略模式。

总结

总结一下,代理模式主要使用了Java的多态,干活的是被代理类,代理类主要是接货,你让我干活,好,我交给幕后的类去干, 你满意就可以,那怎么知道被代理的能不能干活呢,同根就成,同一个接口。

github代码

https://github.com/chenlisong/design
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式