Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对虚拟代理使用状态模式有意义吗?_Java_Oop_Design Patterns_Lazy Initialization_State Pattern - Fatal编程技术网

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();
        }
    }