羞涩男孩八戒喜欢上了邻家女孩嫦娥,由于天性腼腆、不善言辞、性格怯懦等等优良品质的干扰,不敢去当面表
达爱意,于是请自己最好的朋友三藏代为赠送礼物,以牵线搭桥。————这就是代理模式
代理模式:为其它对象提供一种代理以控制对这个对象的访问。
基本结构如下:
①、公用方法接口(八戒、三藏都有的行为)
方法甲
方法乙
②、原型,实现“公用方法接口”(八戒)
方法甲的具体实现
方法乙的具体实现
③、代理,实现“公用方法接口”,实现在某些功能上替代“原型”(三藏)
“原型”的引用ob
方法甲的具体实现(其中含有ob.方法甲)
方法乙的具体实现(其中含有ob.方法乙)
④、目标(嫦娥)
一些属性
⑤、调用者
new出目标
代理在一定程度上替换原型
代理调用改进后的原型方法
示例代码:模拟八戒嫦娥的狗血爱情故事
①、公用方法接口#########################################
/**
* 赠送礼物接口
*/
public interface GiveGift {
public void giveFlowers(); //送花
public void giveDolls(); //送洋娃娃
public void giveChocolate(); //送巧克力
}
②、原型#########################################
/**
* 男孩,求爱者
*/
public class Boy implements GiveGift{
private Girl girl; //思念的女孩
public Boy(Girl girl){
this.girl = girl;
}
@Override
public void giveChocolate() {
System.out.println(girl.getName()+",送你巧克力");
}
@Override
public void giveDolls() {
System.out.println(girl.getName()+",送你洋娃娃");
}
@Override
public void giveFlowers() {
System.out.println(girl.getName()+",送你鲜花");
}
}
③、代理#########################################
/**
* 代理,男孩的朋友,代替羞涩的男孩向女孩表达爱意
*/
public class Proxy implements GiveGift {
private Boy boy; //男孩的引用
public Proxy(Girl girl){
boy = new Boy(girl);
}
@Override
public void giveChocolate() { //替男孩送巧克力
//此处可植入代码
boy.giveChocolate();
//此处可植入代码
}
@Override
public void giveDolls() { //替男孩送洋娃娃
//此处可植入代码
boy.giveDolls();
//此处可植入代码
}
@Override
public void giveFlowers() { //替男孩送花
//此处可植入代码
boy.giveFlowers();
//此处可植入代码
}
}
④、目标#########################################
/**
* 女孩,被追求者
*/
public class Girl {
private String name; //姓名
//构造函数初始化女孩姓名
public Girl(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
⑤、调用者#########################################
public class Test {
public static void main(String[] args) throws Exception {
Girl mm = new Girl("小娥");
Proxy ming = new Proxy(mm); //代理人三藏
ming.giveFlowers();
ming.giveDolls();
ming.giveChocolate();
}
}
Ps:最后三藏和嫦娥在一起了,祝他们幸福,阿门