一、定义
代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。
适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口,使得原本接口不兼容而不能一起工作的那些类可以一起工作。
二、理解
代理模式和适配器模式应该说很相像,但是他们的区别也很明显,代理模式和被代理者的接口是同一个,只是使用中客户访问不到被代理者,所以利用代理间接的访问,而适配器模式,是因为接口不同,为了让用户使用到统一的接口,把原先的对象通过适配器让用户统一的使用,大多数运用在代码维护的后期,或者借用第三方库的情况下
三、类图
代理模式
适配器模式
四、Code
代理模式,代理者保存一个被代理的一个对象;适配器模式,保存了一个被适配的对象
适配器:
public class Person {private String name;
private String sex;
private int age;
public void speakJapanese(){
System.out.println("I can speak Japanese!");
}
public void speakEnglish(){
System.out.println("I can speak English!");
}
...//以下省略成员变量的get和set方法
}
public interface Job {
public abstract void speakJapanese();
public abstract void speakEnglish();
public abstract void speakFrench();
}
public class Adapter extends Person implements Job{
public void speakFrench() {
}
}
代理:
public
interface
KindWomen {
//这种类型的女人能做什么事情呢?
public
void
makeEyesWithMan();
//抛媚眼
public
void
happyWithMan();
//happy what? You know that!
}
public
class
PanJinLian
implements
KindWomen {
public
void
happyWithMan() {
System.out.println(
"潘金莲在和男人做那个....."
);
}
public
void
makeEyesWithMan() {
System.out.println(
"潘金莲抛媚眼"
);
}
}
public
class
WangPo
implements
KindWomen {
private
KindWomen kindWomen;
public
WangPo(){
//默认的话,是潘金莲的代理
this
.kindWomen =
new
PanJinLian();
}
//她可以是KindWomen的任何一个女人的代理,只要你是这一类型
public
WangPo(KindWomen kindWomen){
this
.kindWomen = kindWomen;
}
public
void
happyWithMan() {
this
.kindWomen.happyWithMan();
//自己老了,干不了,可以让年轻的代替
}
public
void
makeEyesWithMan() {
this
.kindWomen.makeEyesWithMan();
//王婆这么大年龄了,谁看她抛媚眼?!
}
}
public
class
XiMenQing {
/*
* 水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道,痴迷了,
* 被王婆看到了, 就开始撮合两人好事,王婆作为潘金莲的代理人
* 收了不少好处费,那我们假设一下:
* 如果没有王婆在中间牵线,这两个不要脸的能成吗?难说的很!
*/
public
static
void
main(String[] args) {
//把王婆叫出来
WangPo wangPo =
new
WangPo();
//然后西门庆就说,我要和潘金莲happy,然后王婆就安排了西门庆丢筷子的那出戏:
wangPo.makeEyesWithMan();
//看到没,虽然表面上时王婆在做,实际上爽的是潘金莲
wangPo.happyWithMan(); }
}