代理模式_只在必要时生成实例(如果代理商能自己处理,绝不找总店来处理)
/**
* @author maikec
* 2019/5/19
*/
public interface Subject {
/**
* 调度处理
*/
void invoke();
}
/**
* 实际处理类
* @author maikec
* 2019/5/19
*/
public class RealSubject implements Subject {
@Override
public void invoke() {
System.out.println("RealSubject");
}
}
/**
* 代理RealSubject
* @see RealSubject
* @author maikec
* 2019/5/19
*/
public class SubjectProxy implements Subject {
private RealSubject realSubject;
/**
* 代理类自己能够处理
*/
private AtomicBoolean isInvokeSelf;
@Override
public void invoke() {
if (null != isInvokeSelf && BooleanUtil.isFalse(isInvokeSelf.get())
&& null != realSubject){
realSubject.invoke();
} else{
//第一次代理类自己处理
System.out.println("Proxy");
if (null == realSubject){
ReentrantReadWriteLock.WriteLock writeLock = new ReentrantReadWriteLock().writeLock();
try {
if (writeLock.tryLock()){
if (null == realSubject){
realSubject = new RealSubject();
isInvokeSelf = new AtomicBoolean(false);
}
}
}finally {
writeLock.unlock();
}
}
}
}
}
/**
* @author maikec
* 2019/5/19
*/
public class ProxyDemo {
public static void main(String[] args) {
Subject subject = new SubjectProxy();
subject.invoke();
System.out.println("===");
subject.invoke();
}
}
复制代码
附录
github.com/maikec/patt… 个人GitHub设计模式案例
声明
引用该文档请注明出处