代理模式
代理模式:为其他对象提供一种代理以控制这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理模式可以在客户端与目标对象之间起到中介的作用。
具体角色:
抽象角色(Subject):通过接口或抽象类声明真实角色实现的业务方法。
代理角色(Proxy):实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑来实现抽象方法,并可附加自己的操作。
真实角色(RealSubject):实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
UML
例:
需求:
有一个追求者想要追一个女孩,给她送礼物,但是不好意思自己送,就找了个一个中间人给女生送礼物。
代码实现:
抽象角色:
/**
* 代理模式
* 抽象接口:定义送礼物的行为
*
*/
public interface GiveGift {
void giveFlower();
void giveChocolate();
}
真实角色:
/**
* 代理模式
* 真实角色:追求者
*
*/
public class Hunter implements GiveGift{
private String girlName;
public Hunter(String girlName){
this.girlName=girlName;
}
@Override
public void giveFlower() {
// TODO Auto-generated method stub
System.out.println("送给"+girlName+"花");
}
@Override
public void giveChocolate() {
// TODO Auto-generated method stub
System.out.println("送给"+girlName+"巧克力");
}
}
代理角色:
/**
* 代理模式
* 代理对象:追求者与被追求者的中间人
*
*/
public class Middleman implements GiveGift {
private Hunter hunter;
public Middleman(String girlName){
if (hunter==null) {
hunter=new Hunter(girlName);
}
}
@Override
public void giveFlower() {
// TODO Auto-generated method stub
hunter.giveFlower();
}
@Override
public void giveChocolate() {
// TODO Auto-generated method stub
hunter.giveChocolate();
}
}
客户端:
public class Client {
public static void main(String[] args) {
GiveGift giveGift=new Middleman("李娇娇");
giveGift.giveFlower();
giveGift.giveChocolate();
}
}