Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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 Flyweight模式中描述的内在和外在状态之间的区别是什么?_Java_Design Patterns_Flyweight Pattern - Fatal编程技术网

Java Flyweight模式中描述的内在和外在状态之间的区别是什么?

Java Flyweight模式中描述的内在和外在状态之间的区别是什么?,java,design-patterns,flyweight-pattern,Java,Design Patterns,Flyweight Pattern,从FlyWeight模式一章中可以看出,当大多数对象状态都是外部的时,FlyWeight模式适用 外在状态是什么意思?我觉得这种模式是用来共享对象的。如果要共享对象,那么该对象怎么可能有任何状态 无论项目符号列表中的具体措辞如何,理解这条信息是很重要的:Flyweight适用于状态的重要部分可以在多个对象之间共享的情况,因为对于所有对象来说,某些数据是相同的。通常,共享状态本质上是不变的(即“普遍真理”)。字体的例子使这一点非常清楚;日常Java中的一个例子是Java.util.regex.Pa

FlyWeight
模式一章中可以看出,当大多数对象状态都是外部的时,FlyWeight模式适用


外在状态是什么意思?我觉得这种模式是用来共享对象的。如果要共享对象,那么该对象怎么可能有任何状态

无论项目符号列表中的具体措辞如何,理解这条信息是很重要的:Flyweight适用于状态的重要部分可以在多个对象之间共享的情况,因为对于所有对象来说,某些数据是相同的。通常,共享状态本质上是不变的(即“普遍真理”)。字体的例子使这一点非常清楚;日常Java中的一个例子是
Java.util.regex.Pattern
,flyweight与
Matcher
,客户端对象重用它并保持本地外部状态。许多
Matcher
s可以并行存在,它们都在内部重用已编译的正则表达式

这句话比你的问题更清楚:

共享的飞锤越多,节省的存储空间就越大。随着共享状态数量的增加,节省量也随之增加。当对象同时使用大量的内在和外在状态,并且外在状态可以计算而不是存储时,节省的成本最大。然后,您可以通过两种方式节省存储空间:共享降低了内部状态的成本,以及用外部状态换取计算时间


让我们以文字处理器为例:


文字处理器处理字符对象。字符对象的状态是字符内容、字体、样式、位置等(就字处理器而言)。不同的文档使用不同的字符实例。假设我们只处理a-z字符,不同的文档使用a-z池中的字母,但可能应用不同的字体/样式。因此,如果我们将字符的内容与字体/样式分开,我们就可以共享这些字符,这是有意义的,因为与不同文档中使用的不同字符实例相比,不同类型的字符总数较少(在本例中为26个,但在其他情况下为常数)。共享这些角色实例意味着共享角色实例的内容,并在外部将类似于上下文的字体/样式应用于这些角色。字符内容为内在状态,字体/样式为外在状态。在上面的示例中,将状态分为内部和外部状态可以节省大量存储。

外部-属于对象上下文(外部)或该实例特有的状态

内在-自然属于“FlyWeight”对象的状态,因此应该是永久的或不可变的(内部)或上下文无关的。

FlyWeight设计模式引入了内在和外在状态的概念:

这里的关键概念是内在和外在状态之间的区别。固有状态存储在飞锤中;它包含独立于flyweight上下文的信息,因此可以共享。外部状态取决于flyweight的上下文并随其变化,因此无法共享。客户端对象负责在flyweight需要时将外部状态传递给它

换句话说,对象的状态可以相对于对象组分解为内在状态和外在状态,其中内在状态是组中所有对象的状态的交点,外在状态是对象的状态和内在状态的差。由于内部状态在组中的每个对象中都是重复的,因此可以通过将对象组替换为存储单个内部状态的单个flyweight对象来节省空间。但是,flyweight对象无法存储组对象的多个外部状态,因此外部状态存储在外部,并在来自客户端对象的每个请求中传递给flyweight对象。由于flyweight对象不存储外部状态,因此这种优化的通信协议通常称为a。无状态协议的示例包括IP和HTTP(以及更一般的任何REST协议,其中内在状态称为资源状态,外在状态称为应用程序状态)

例如,让我们使用三个对象及其各自的客户端:

o1← c1
氧气← c2
臭氧← c3

我们可以根据三个对象分解每个对象的状态:

状态1=固有状态∪ 外在状态1
状态2=固有状态∪ 外在状态2
状态3=固有状态∪ 外在状态3

其中:

固有状态=状态1∩ 国家2∩ 状态3
外在状态1=状态1 \内在状态
外在状态2=状态2 \内在状态
外在状态3=状态3 \内在状态

这里的内在状态是重复的。因此,将其存储在单个flyweight对象中(并将外部状态移动到客户端)可以节省空间:

o← c1,c2,c3


Extrinsic state
表示对象外部您所说的面向客户的对象是什么意思?能否在您的回答中提供一个示例来阐明您的总体回答?我特别不清楚外部对象的状态如何不属于对象本身。但为什么他们说,如果大多数状态都可以是外部的,那么Flywiight模式的适用性就变得实用了呢?让我们来看看这里仍然存在一些困惑。我认为共享(因此在某种意义上重用)只能针对内在状态进行。外部状态无法共享,因此无法重用。这种状态因对象而异。那么,为什么大多数州都必须对这种特定模式的适用性进行外部评估呢