我试图理解策略模式并问自己:上下文类是必须具备的,还是可以在不损害模式目的的情况下将其省略?
我给我的印象是我需要某种开关来读取不同类型的文件,但不想仅仅破解某些东西,以后再进行重构(尽管当然总是可以对代码进行重构,但是想法是:尝试事先在设计中尽可能地聪明...):
图片取自Wikimedia
客户可以直接委派给Strategy界面吗?或者我只是想了解有关上下文类的内容?
interface Reader {
// read information from file and fill data list field of Client
readFile();
}
class ExcelReader implements Reader{ /* */ }
class PdfReader implements Reader{ /* */}
class Client{
// strategic choice
Reader r;
// data list field
List<Data> data;
// Client Constructor
public Client(){
if(<file ends in .xls>)
r = new ExcelReader();
else
r = new PdfReader();
r.readFile();
}
}
因此,上面描绘的是上下文类丢失。代码是否遵守策略模式?
1
作为另一个有趣/重要的观点,我想提醒您注意,功能语言中的类型类的概念“简单地”是种类为en.wikipedia.org/wiki/Kind_(type_theory)的策略模式。两者只是临时多态性的一种实现机制。
—
AndreasScheinert
这(或多或少)与Java 8 Project Lambda有关吗?Wikipedia的文章对我来说太密集了,无法立即理解,但是如果这些是有效使用Java即将出现的功能(或一般而言编程)的理论背景的一部分,我将很乐意在其中花费更多的时间。
—
panny
很远,但我会说是的,类型类需要。一种支持更高种类的编程语言。scala和Haskell就是这种情况。我的意思是,(即席)多态性的实现方式有所不同,如果您退后一步,通常可以了解一些有关多态性的见解。
—
AndreasScheinert