java - 如何实现代理模式?
问题描述
我试图了解如何制作和使用代理设计模式。我不知道我做错了什么。任何建议,将不胜感激:
加载方法应该模拟从远程服务器下载配置......它有点。2秒延迟应该只启动一次,然后就可以顺利进行了。
public interface ConfigLoader {
String load();
}
真实对象
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.RandomStringUtils;
import pl.sdacademy.prog.streams.MyExepction;
@Getter
@Setter
public class ConfigLoaderImplementation implements ConfigLoader {
private String configuration;
private String serverUrl;
public ConfigLoaderImplementation(final String serverUrl) {
this.serverUrl = serverUrl;
}
@Override
public String load() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new MyException("Sleeping canceled!", e);
}
System.out.println("Configuration from " + getServerUrl() + " downloaded successfully");
String generatedConfiguration = RandomStringUtils.randomAlphabetic(10);
setConfiguration(generatedConfiguration);
return generatedConfiguration;
}
}
代理
import lombok.Data;
@Data
public class ConfigLoaderProxy implements ConfigLoader {
private ConfigLoader proxy;
public ConfigLoaderProxy(String url) {
this.proxy = proxy;
}
@Override
public String load() {
if (proxy == null) {
proxy = new ConfigLoaderImplementation("www.blablA.com");
return proxy.load();
} else {
return proxy.load();
}
//todo
}
}
测试类,主要
public class ConfigLoaderDemo {
public static void main(String[] args) {
ConfigLoader proxy = new ConfigLoaderProxy("sdasd");
proxy.load();
proxy.load();
proxy.load();
}
}
解决方案
public class ConfigLoaderProxy implements ConfigLoader {
private final ConfigLoader configLoader;
private String configuration;
public ConfigLoaderProxy(final ConfigLoader configLoader) {
this.configLoader = configLoader;
}
@Override
public String load() {
if (configuration == null) {
configuration = configLoader.load();
}
return configuration;
}
}
推荐阅读
- gps - 过滤掉相同半径内的 GPS 坐标
- php - laravel刀片中的嵌套foreach循环
- angular - 在一个组件中使用多个服务的最佳实践
- c# - 防止在监听器与 Firebase 连接时触发 ValueChanged
- php - php查询两个日期之间登录用户和未登录用户
- c# - DynamoDB 无法转换为 System.DateTime
- .net - 使用具有不同 TRead/TWrite 的 System.Threading.Channels
- sql-server - 在 MSSQL 中查询键值对数据库
- android - Android GraphView - 如何使用单独的 LabelFormatter?
- android - Android Studio 将 Kotlin 依赖项导入 Java 文件