当前位置: 首页 > 知识库问答 >
问题:

我们有(官方的?)此模式得名称?[关闭]

柯轶
2023-03-14

在Java的一次关于继承的有用性的讨论中,我偶然发现了一个类的这种模式:

public final class Demo<T>
{
  private final T m_Value;
  private final Function<T,String> m_Processor;

  public Demo( final T value, final Function<T,String> processor )
  {
    m_Value = value;
    m_Processor = processor;
  }

  public final String process() { return m_Processor.apply( m_Value ); }
}

坦白地说,这个特殊的类的用处有限!但它应该只演示底层模式:我可以有相同类的实例,但每个实例都有不同的行为,因为我在创建时分配了不同的处理器。

甚至更糟的是,当m_processor不是最终的,并且我为它提供了一个setter时,它可以在它的生存期内改变它的行为。

由于这与JavaScript的行为类似,因此讨论的一位参与者为其创造了“JavaScript继承”的名称。

当然,我们可以开始讨论这个模式的有用性,或者它是否是一个反模式…但请不要在这里!我只是感兴趣的是如果已经有一个名字为它!

通过分配处理器来确定demo的行为类似于“策略”模式,在这方面,示例可能会被选错。

但是“策略”并不意味着是继承的替代,它利用了多态性。

更好的候选者将是“facade”或“adapter”(从目的来看),但它们的实现方式不同。

共有1个答案

董胡媚
2023-03-14

我认为这是一个组合凌驾于继承之上的例子。继承有时可能是矫枉过正。让我们举一个例子。

public interface Duck{
  public void fly();
}

public class DuckOne implements Duck{
  public void fly(){
     System.out.print("flying"!)
  }
}

public class DuckTwo implements Duck{
  public void fly(){
     System.out.print("flying"!)
  }
}

public class DuckThree implements Duck{
  public void fly(){
     System.out.print("can't fly"!)
  }
}

如您所见,fly方法可以在不同duck实现中通用。并且假设您需要更改一个常见的fly方法。您需要修改所有的duck子类。下面我们就来看看吧。

public interface Duck{
  public void fly();
}

public interface Fly{
  public void process();
}
public class CanFly implements Fly{
  public void process(){
     System.out.print("flying");
}
public class CanNotFly implements Fly{
  public void process(){
     System.out.print("not flying");
}

public class DuckOne implements Duck{
  private Fly fly;
  public DuckOne(Fly canFly){
     this.fly = fly;
  }
  public void fly(){
     fly.process();
  }
}

public class DuckTwo implements Duck{
  private Fly fly;
  public DuckTwo(Fly canFly){
     this.fly = fly;
  }
  public void fly(){
     fly.process();
  }
}

public class DuckOne implements Duck{
  private Fly fly;
  public DuckOne(Fly cannotFly){
     this.fly = fly;
  }
  public void fly(){
     fly.process();
  }
}

现在只能修改一个fly类。希望澄清其中的一个优点。

 类似资料:
  • 我想知道下面的模式对于Avro模式是否有效。请注意,字段数组的第一个对象中缺少名称。 它实际上是针对以下类型的数据设计的 根据下面的阅读,似乎没有名字的数组是不允许的 Avro架构失败 https://avro.apache.org/docs/current/spec.html#schema_complex 我怀疑下面是正确的 它应该有如下数据,以便成功进行avro转换 下面的模式是否有效?在第一

  • 问题内容: 我有一个很好的功能,可以以给定类型打印有关给定方法的一些信息,这是一个goplay 除了我找不到找到方法参数名称的方法以外,我需要做的所有事情吗? 问题答案: 局部变量的名称(包括函数参数)仅适用于程序员。编译器在生成代码时将其丢弃。无法检索参数名称,因为它们在编译后的代码中不可用。

  • BIFunctor有一个带有此签名的映射函数: 你也可以有这样一张地图: 具有此函数的类型是双函数函数的严格子集(您总是可以使用定义,但反之亦然)。第二个签名有名字吗? 跟进:这个中间功能怎么样?

  • 我想在编译时使用类型的名称。例如,假设我写过: 现在我想拥有: 但是唉,只是,而不是常量表达式。。。是否有其他的constexpr方法来获取类型的名称?

  • 如何在某个模板类的基础上,通过写死(绑定)部分模板参数类型,来定制出一个新的模板类? 尝尝我这种写法如何: template<class T> // 采用了自定义内存分配器的std::vector using Vec = std::vector<T,My_alloc<T>>; // 使用My_alloc为元素分配存储空间 Vec<int> fib = { 1, 2, 3, 5, 8, 13 };

  • 我需要使用Spring batch每两个月处理一次输入文件。文件名带有时间戳,因此每次运行时都会更改。 文件名:NY_Prov_mmddyyyy。csv 我正在使用下面的代码来读取文件,我试图只给出目录名,因为fileName中有一个模式,并且文件名不是固定的。但是,这不起作用。 application.properties: 错误: 原因:java.lang.IllegalStateExcept