班上应该包括什么方法

时间:2014-02-24 09:17:38

标签: c# design-patterns code-structure

我很困惑应该在类中包含哪种类型的方法以及应该在服务类中编写哪种类型的方法?

这是我的情景:

我正在写一个音乐商店应用,我的模型设计如下

 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; }
    }

}

用户可以执行此类操作:

  1. 下载整个专辑或某些特定音乐文件;
  2. 删除本地文件;
  3. 将相册添加到收藏列表;
  4. 从收藏列表中删除相册。
  5. 我应该将Dwonload等方法放在模型中还是其他服务类中?如果我将它们放在模型中,模型应该引用其他一些类。我目前的解决方案是:

    solution1 :创建IDownload / IFavorite接口并让模型实现它们,方法包含在模型中;

    solution2 :创建一个抽象类,其中包含与下载操作和收藏操作相关的所有属性;让模型继承自抽象类;创建DownloadService类和FavoriteService类来实现操作的细节,传递如下所示的参数:

    AbstractClass obj1 = new MusicFile();
    AbstractClass obj2 = nwe Album();
    

    哪种解决方案合情合理,还是有其他解决方案?

    谢谢!

2 个答案:

答案 0 :(得分:1)

还可以更好地调用音乐工件下载,因此您可以在不更改下载调用程序接口的情况下更改或添加新工件。这是我对问题的理解。

请考虑这是伪代码,并使用正确的语法编写自己的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
}


}

答案 1 :(得分:0)

我认为最干净的解决方案是一个被假定的服务类,例如“下载器”。如果下载是一个经常使用的操作,您可以在音乐文件类或其基类之一上引入一个外观,以提高代码的可理解性。

关于是将下载方法放在接口还是抽象基类中的问题的答案取决于您如何看待这些操作的使用。例如,如果您主要以访问能力的方式访问下载操作,例如你想下载很多东西,并不关心这些项目是什么,那么界面是最好的选择。原因是接口不限制继承层次结构,而抽象基类则限制。

如果您可以跨多个文件共享操作的实现,那么抽象基类是很好的。因此,如果下载相册与下载音乐文件的代码相同,则具有共享实现的抽象类更合适。

通常,你根据自己的能力使用对象做某些事情,这些东西的实现确实是共享的。在这种情况下,最好的方法是使用包含共享代码的接口和单独的抽象基类。这样,您就可以使用接口和抽象基类的优点。如果您查看BCL,例如在ADO.NET中,很多概念都以这种方式实现。