结构型模式描述如何将类或者对象结合在一起组成形成更大的结构。结构型模式的目的是通过组合类或对象产生更大结构以适用更高逻辑的需求,包括以下7种模式:
- 代理模式
- 装饰模式
- 适配器模式
- 组合模式
- 桥梁模式
- 外观模式
- 享元模式
代理模式
1、介绍
Provide a surrogate or placeholder for another object to control access to it.
为其他对象提供一种代理以控制对这个对象的访问。
代理模式是使用率非常高的模式,许多其他模式例如:状态模式、策略模式、访问者模式本质上也采用了代理模式。
2、使用场景
当无法或不想直接访问某个对象、或者访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同接口。
3、UML类图
角色说明:
- 抽象主题(Subject)角色:该角色是真实主题和代理主题的共同接口,以便在任何可以使用真实主题的地方都可以用代理助理。
- 真实主题(RealSubject)角色:被代理角色,是业务逻辑的真正执行者。
- 代理主题(ProxySubject)角色:该角色负责控制对真实主题的引用,负责在需要时创建和删除真实主题,以及完成真实主题任务的预处理和后处理工作。
4、示例
/**
* 抽象主题类
* @author xiaofeizhu
*
*/
public interface IGamePlayer {
// 杀怪
public void killBoss();
// 升级
public void upGrade();
}
/**
* 真实主题
* @author xiaofeizhu
*
*/
public class GamePlayer implements IGamePlayer{
private String name = "";
public GamePlayer(String name) {
super();
this.name = name;
}
@Override
public void killBoss() {
System.out.println(this.name + "在打怪");
}
@Override
public void upGrade() {
System.out.println(this.name + "在升级");
}
}
/**
* 代理主题
* @author xiaofeizhu
*
*/
public class GamePlayerProxy implements IGamePlayer {
private IGamePlayer player = null;
public GamePlayerProxy(IGamePlayer player) {
this.player = player;
}
@Override
public void killBoss() {
player.killBoss();
}
@Override
public void upGrade() {
player.upGrade();
}
}
/**
* 客户端
* @author xiaofeizhu
*
*/
public class Client {
public static void main(String[] args) {
IGamePlayer player = new GamePlayer("大王");
IGamePlayer proxy = new GamePlayerProxy(player);
proxy.killBoss();
proxy.upGrade();
}
}
输出结果如下:
大王在打怪
大王在升级
5、总结
优点:
- 职责清楚:真实主题角色只需实现业务的逻辑,无需关心其他非本职事务。
- 高扩展性:具体主题角色随需求不同可能有多种,但只要实现了接口,代理类就可以完全不做任何修改的情况下代理各种真实主题角色
- 智能化:代理类可以在运行时才确认需要去代理的真实主题。
缺点:
类增加