我现在有一个音乐播放器歌曲选择的需求:
播放器中选择歌曲的方式有三种:1.按本地目录选择 2.按歌星选择 3.按歌曲分类选择 4.按排行榜top50选择 5.新歌top50选择。
因为以后可能有其他选择方式,所以有必要在这里对代码解耦。看上去可以应用策略模式来实现:客户端依赖某个接口IProvideSongs,然后具体的选择方式则实现该接口。
但是遇到一个问题:这些选择方式有些需要传入参数(例如“按本地目录选择”要依赖于用户指定的目录路径,而“按明星选择”则依赖于传入的歌星姓名),有些则不用传入参数(如“排行榜top50选择”和“新歌top50选择”已经指定了top50,而不是top100或者其他,所以不用传入任何参数),而且需要传入参数的选择方式中,参数的性质也不同(例如“按本地目录选择”是传入路径,而“按歌星选择”是传入人名),也就是说客户端还与具体的选择方式有干系。下图是草拟的UML图:
很明显客户端(client)对具体的“选择方式”的依赖又搞得代码耦合到一团了。但具体的“选择方式”有的确需要等待客户端传入一些参数...这样的情况应该怎样设计代码才好?