Java 对虚拟代理使用状态模式有意义吗?
在这里,我正在为一个重量级对象制作一个虚拟代理。每次调用Java 对虚拟代理使用状态模式有意义吗?,java,oop,design-patterns,lazy-initialization,state-pattern,Java,Oop,Design Patterns,Lazy Initialization,State Pattern,在这里,我正在为一个重量级对象制作一个虚拟代理。每次调用HeavweightObject::operate之前,程序都会首先检查对象是否为null。在对象的整个生命周期中,此零件只检查一次 一个可能的改进可能是使用如下状态模式: class HeavyweightObjcet { public void operate() { System.out.println("Operating..."); } } class LazyInitializer {
HeavweightObject::operate
之前,程序都会首先检查对象是否为null
。在对象的整个生命周期中,此零件只检查一次
一个可能的改进可能是使用如下状态模式:
class HeavyweightObjcet
{
public void operate() {
System.out.println("Operating...");
}
}
class LazyInitializer
{
HeavyweightObjcet objcet;
public void operate()
{
if (objcet == null)
objcet = new HeavyweightObjcet();
objcet.operate();
}
}
这个解决方案有意义吗
代码是否有任何可能的改进
以前有没有类似的例子
这是一个不必要的复杂问题,还是值得,还是取决于具体情况
它能让代码更快吗?我的意思是,额外的函数调用可能比简单的条件调用慢
这是一个不必要的复杂问题,还是值得,还是值得
视情况而定
虽然在使用时只有两种状态是完全可以的,但在这种特殊情况下,由于以下原因,这无疑是一种过度杀伤力:
UninitializedState
->InitailizedState
。一次重量级ToBjSet
已经初始化,您肯定不会
在从InitializedState
->未初始化状态转换到或
反之亦然
operate
方法是线程安全的吗?)operate
方法没有令人信服的理由改变HeavweightObject
的初始化。此外,初始化代码首先应该在构造函数中,而不是operate
方法中
class HeavyweightObjcet
{
public void operate() {
System.out.println("Operating...");
}
}
class LazyInitializer
{
HeavyweightObjcet objcet;
State state = new UninitializedState(this);
public void operate()
{
state.operate();
}
}
abstract class State
{
LazyInitializer initializer;
public State(LazyInitializer initializer)
{
this.initializer = initializer;
}
abstract void operate();
}
class UninitializedState extends State
{
public UninitializedState(LazyInitializer initializer) {
super(initializer);
}
@Override
public void operate() {
initializer.objcet = new HeavyweightObjcet();
initializer.state = new InitializedState(initializer);
initializer.operate();
}
}
class InitializedState extends State
{
public InitializedState(LazyInitializer initializer) {
super(initializer);
}
@Override
public void operate() {
initializer.objcet.operate();
}
}