我很困惑类中应该包括什么类型的方法,以及服务类中应该编写什么类型的方式?
这是我的场景:
我正在写一个音乐商店应用程序,我的模型设计如下
public class Album
{
private string title;
public string Title
{
get { return title; }
set { title = value; }
}
private double price;
public double Price
{
get { return price; }
set { price = value; }
}
private List<Music> musicFiles;
public List<Music> MusicFiles
{
get { return musicFiles; }
set { musicFiles = value; }
}
}
public class Music
{
private string title;
public string Title
{
get { return title; }
set { title = value; }
}
private string duration;
public string Duration
{
get { return duration; }
set { duration = value; }
}
}
用户可以进行这样的操作:
- 下载整张专辑或一些特定的音乐文件
- 删除本地文件
- 将相册添加到收藏夹列表
- 从收藏夹列表中删除相册
我应该把Dwonload之类的方法放在模型中还是放在另一个服务类中?如果我把它们放在模型中,模型应该引用一些其他类。我目前的解决方案是:
解决方案1:创建IDownload/IFavorite接口并让模型实现它们,方法包含在模型中;
解决方案2:创建一个抽象类,该类包含与下载操作和收藏夹操作相关的所有属性;让模型继承抽象类;创建DownloadService类和FavoriteService类来实现操作的详细信息,传递如下参数:
AbstractClass obj1 = new MusicFile();
AbstractClass obj2 = nwe Album();
哪种解决方案是明智的,或者还有其他解决方案吗?
谢谢!
还可以更好地调用音乐工件下载,因此您可以在不更改下载调用方界面的情况下更改或添加新工件。这是我对这个问题的理解。
请考虑这是伪代码,并用正确的语法编写自己的java代码。
//Client call
DownloadStore store = new DownloadStore(myMusicfile)
store.download();
DownloadStore store = new DownloadStore(myAlbum)
store.download();
//your download store
DownloadStore {
IMusicArtifact artifact;
DownloadStore(IMusicArtifact artifact){
this.artifact=artifact;
}
public downlod(){
//write common coding for any artifact...
//artifact specific implemenation is called here
artifact.download();
}
}
//your interface class
IMusicArtifact {
download();
}
//your concrete class
Muscifile implements IMusicArtifact {
download(){
// Music file related downloaind stuff
}
}
//your concrete class
Album implements IMusicArtifact {
download(){
// Album related downloaind stuff
}
}
我认为最干净的解决方案是一个decated服务类,例如"Downloader"。如果下载是一个经常使用的操作,您可以在音乐文件类或其基类中引入facade,以提高代码的可理解性。
您的问题是将下载方法放在接口中还是放在抽象基类中,答案取决于您认为这些操作将如何使用。例如,如果你访问下载操作主要是作为一种能力,例如,你想下载很多东西,但并不真正关心这些项目是什么,那么界面是最好的选择。原因是接口不限制继承层次结构,而抽象基类则限制继承层次。
如果可以在多个文件之间共享操作的实现,那么抽象基类就很好。因此,如果下载专辑的代码与下载音乐文件的代码相同,那么具有共享实现的抽象类更合适。
通常,使用对象是基于它们做某些事情的能力,并且这些事情的实现确实是共享的。在这种情况下,最好的方法是使用一个接口和一个包含共享代码的单独抽象基类。通过这种方式,您可以同时使用接口和抽象基类的优点。如果你在BCL中查看,例如在ADO。NET的许多概念都是这样实现的。