【发布时间】:2019-08-31 11:21:52
【问题描述】:
我是设计模式的新手,我知道单一职责原则的目的,但不能 100% 确定它如何避免大量微小的变化。下面是我的例子:
//very crude implementation
public class Journal
{
private readonly List<string> entries = new List<string>();
private static int count = 0;
public void AddEntry(string text)
{
entries.Add($"{++count}: {text}");
}
public void RemoveEntry(int index)
{
entries.RemoveAt(index);
count--;
}
public void SaveToDisk(string filename)
{
File.WriteAllText(filename, ToString());
}
}
我知道SaveToDisk方法不应该包含在类中,它应该是一个专门的类,比如PersistenceManager来处理文件保存。
但是为什么我不能在Journal 类中保留SaveToDisk() 方法?如果有什么新的需求,比如将日志保存到云端,那么我只需添加一个新方法SaveToCloud(),任何依赖的客户端类都可以使用SaveToCloud(),我需要做的唯一修改是在@中添加SaveToCloud() 987654330@class,哪个没问题?
已编辑:以下是我的修改版本,请指出任何设计错误:
class Program
{
static void Main(string[] args)
{
Consumer client = new Consumer(new DiskManager("C:\\journal.txt"));
// consumer add text to Journal
client.AddJournal("sometext");
client.SaveJournal();
}
}
public class Journal
{
private readonly List<string> entries = new List<string>();
public void AddEntry(string text)
{
entries.Add(text);
}
public void RemoveEntry(int index)
{
entries.RemoveAt(index);
}
}
public interface IPersistenceManager
{
void Save(Journal journal);
}
public class DiskManager : IPersistenceManager
{
private string filePath;
public DiskManager(string filePath)
{
this.filePath = filePath;
}
public void Save(Journal journal)
{
//XXX.XXX.Save(filePath);
}
}
public class CloudManager : IPersistenceManager
{
private string url;
public CloudManager(string url)
{
this.url = url;
}
public void Save(Journal journal)
{
//XXX.XXX.Save(url);
}
}
public class Consumer
{
private Journal _journal = new Journal();
private IPersistenceManager _manager;
public void AddJournal(string note)
{
_journal.AddEntry(note);
}
public Consumer(IPersistenceManager manager)
{
_manager = manager;
}
public void SaveJournal()
{
_manager.Save(_journal);
}
}
【问题讨论】:
-
看到这里,我有一个问题:如何加载期刊?可能来自期刊课外,对吧?
-
@John 让事情变得简单,假设我只需要创建和保存日志
-
如果您还没有看过这篇文章,请阅读一些有用的文章stackoverflow.com/a/7591887/5233410
-
@Nkosi 但就我而言,你能告诉我为什么将 save 方法放在日志类中会导致很多变化吗?
标签: c# design-patterns single-responsibility-principle