结构型模式的目的是通过组合类或对象产生更大结构,以适应更高层次的逻辑需求;
结构型模式共有7种:
■ 代理模式
■ 装饰模式
■ 适配器模式
■ 组合模式
■ 桥梁模式
■ 外观模式
■ 享元模式
一、代理模式简介
为其他对象提供一种代理以控制对这个对象的访问;
image.png
二、代理模式3个角色
■ 抽象主题(Subject)角色:该角色是真实主题和代理主题的共同接口;
■ 代理主题(Proxy Subject)角色:也叫做委托类、代理类,该角色负责控制对真实主题的引用;
1) 在需要的时候创建或删除真实主题对象;
2) 在真实主题角色处理完毕前后做预处理和善后处理工作;
■ 真实主题(Real Subject)角色:该角色也叫做被委托角色、被代理角色,是业务逻辑的具体执行者;
public interface Subject {
public void request();
}
public class RealSubject implements Subject{
@Override
public void request() {
// 业务逻辑处理
System.out.println("这里是真正的逻辑处理");
}
}
public class ProxySubject implements Subject{
private Subject subject;
public ProxySubject(Subject subject){
this.subject = subject;
}
@Override
public void request() {
this.beforeRequest();
subject.request();
this.afterRequest();
}
private void beforeRequest(){
// 预处理
System.out.println("预处理");
}
private void afterRequest(){
// 善后处理
System.out.println("善后处理");
}
}
public class ClientDemo {
public static void main(String[] args){
Subject realSubject = new RealSubject();
Subject proxySubject = new ProxySubject(realSubject);
proxySubject.request();
}
}
# 控制台输出 :
预处理
这里是真正的逻辑处理
善后处理
三、代理模式的优点
■ 职责清晰:真实的角色实现实际的业务逻辑,不用关心其他非本职的事务;
通过后期的代理完成附加的事务,附带的结果就是编程简洁清晰;
■ 高扩展性:具体主题角色随需求不同可能有很多种,但只要实现了接口,代理类就完全可以在不做任何修改的情况下代理各种真实主题角色;
■ 智能化:代理类可以在运行时才确定需要去代理的真实主题;
四、代理模式的实例(游戏代练)
image.png
public interface IGamePlayer {
// 杀怪
void killBoss();
// 升级
void upGrade();
}
public class GamePlayer implements IGamePlayer{
private String name;
public GamePlayer(String name){
this.name = name;
}
@Override
public void killBoss() {
System.out.println(name + "杀死了boss");
}
@Override
public void upGrade() {
System.out.println(name + "升级了");
}
}
public class GamePlayerProxy implements IGamePlayer{
private IGamePlayer iGamePlayer;
public GamePlayerProxy(IGamePlayer iGamePlayer){
this.iGamePlayer = iGamePlayer;
}
@Override
public void killBoss() {
// 记录打怪时间
log();
iGamePlayer.killBoss();
}
@Override
public void upGrade() {
iGamePlayer.upGrade();
// 计算升级所需的时间
count();
}
private void log(){
System.out.println("打怪时间 : " + new Date().toString());
}
private void count(){
System.out.println("升一级需要50个小时.");
}
}
public class ClientDemo {
public static void main(String[] args){
IGamePlayer gamePlayer = new GamePlayer("小号007");
IGamePlayer gamePlayerProxy = new GamePlayerProxy(gamePlayer);
gamePlayerProxy.killBoss();
gamePlayerProxy.upGrade();
}
}
# 控制台输出 :
打怪时间 : Mon Jun 13 18:40:38 CST 2022
小号007杀死了boss
小号007升级了
升一级需要50个小时.
参考:
摘录 《设计模式(Java版)》韩敬海主编;(微信读书APP中有资源,可以直接阅读)
网友评论