gpt4 book ai didi

java - 将状态模式与虚拟代理一起使用是否有意义?

转载 作者:行者123 更新时间:2023-12-01 12:00:53 27 4
gpt4 key购买 nike

class HeavyweightObjcet
{
public void operate() {
System.out.println("Operating...");
}
}

class LazyInitializer
{
HeavyweightObjcet objcet;

public void operate()
{
if (objcet == null)
objcet = new HeavyweightObjcet();
objcet.operate();
}
}

在这里,我正在为重量级对象制作虚拟代理。每次打电话前 HeavyweightObject::operate ,程序首先检查对象是否为 null或不。这部分在对象的整个生命周期中只检查一次。

可能的改进可能是使用这样的状态模式:
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();
}
}

这个解决方案有意义吗?

代码是否有任何可能的改进?

以前做过这样的事情有没有例子?

这是不必要的并发症还是值得还是取决于情况?

它会使代码更快吗?我的意思是,额外的函数调用可能比简单的条件调用慢。

最佳答案

Is it an unnecessary complication or does it worth it or does it depend on the situation?



虽然在使用 State Pattern 时只有 2 个状态是完全可以的,由于以下原因,在这种特殊情况下绝对是一种矫枉过正:
  • 永远只会有一个状态转换从UninitializedState -> InitailizedState .曾经HeavyWeightObjcet已经初始化,你绝对不会
    在从 InitializedState 转换之间交替-> UninitializedState或者
    反之亦然
  • 我们之所以有 YAGNI 等设计原则是有原因的。 (你不会需要它)和 KISS (保持简单,愚蠢)。不要在代码的第一次迭代中引入复杂性。让设计作为持续重构的一部分而发展。
  • 虽然上面的例子在纸面上看起来不错,但现实世界却完全不同。在现实世界的代码中还有更重要的问题需要解决。 (例如,operate 方法线程安全吗?)

  • Does it make the code faster? I mean, the extra function calls may be slower than just a simple conditional.



    当涉及到性能时,这个区域太小而无需担心 Read : micro-optimization

    最后但并非最不重要的是,状态模式允许我们遵守 Open-Closed principle. .正如示例所示, operate 没有令人信服的理由。方法更改至 HeavyWeightObject 的初始化被关注到。而且,初始化代码应该在构造函数中而不是 operate方法放在首位。

    关于java - 将状态模式与虚拟代理一起使用是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61948882/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com