代理模式(Proxy Pattern),为其它对象提供一种代理以控制对这个对象的访问。
-
Rain 抽象接口
-
ConcreteRain 具体的实现类
-
ProxyRain 具体的代理实现
这里的代理模式实现主要是 在代理类中的构造器中实现concreteRain这个具体类, 这样在调用的时候就直接关心代理类, 而不关注具体的实现类
这里的ProxyRain只能代理 concreateRain.代码如下:
package myc_demo.proxy;
/**
* @program: Demo
* @description: 人间有味是清欢
* @author: liuSha.pufengjun
* @create: 2018-07-26 16:33
**/
public interface Rain {
void raining();
}
package myc_demo.proxy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @program: Demo
* @description: 人间有味是清欢
* Concrete 具体的
* @author: liuSha.pufengjun
* @create: 2018-07-26 16:38
**/
public class ConcreteRain implements Rain {
private static final Logger logger = LoggerFactory.getLogger(ConcreteRain.class);
@Override
public void raining() {
logger.info("ConcreteRain.raining");
}
}
package myc_demo.proxy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Random;
/**
* @program: Demo
* @description: 人间有味是清欢
* @author: liuSha.pufengjun
* @create: 2018-07-26 16:40
**/
public class ProxyRain implements Rain {
private static final Logger logger = LoggerFactory.getLogger(ProxyRain.class);
private Rain rain;
public ProxyRain() {
rain = new ConcreteRain();
}
@Override
public void raining() {
pre();
if(new Random().nextBoolean()){
rain.raining();
}else {
logger.info("permission denied");
}
post();
}
private void pre() {
logger.info("ProxyRain.pre()");
}
private void post() {
logger.info("ProxyRain.post()");
}
}
测试类:
package myc_demo.proxy;
/**
* @program: Demo
* @description: 人间有味是清欢
* @author: liuSha.pufengjun
* @create: 2018-07-26 16:45
**/
public class StaticProxyClient {
public static void main(String[] args) {
Rain rain = new ProxyRain();
rain.raining();
}
}
测试结果如下: