开闭原则:
软件实体应当对扩展开放(增加新的类),而对修改源代码关闭,
适用于:
if(type=="pie") peichat.display();
if(type=="bar") barChart.display()
实现开闭原则的关键是实现抽象化,并且从抽象化导出具体化实现,我们通常添加抽象层来实现,
适用于:
下面是我模仿写的代码:
//采用开闭原则,就是不一样
public class WordQueue
{
private static AbstractGetWordQueue m_getWordQueue;
//这里我简化一下类,完全可以简化
//public void SetGetWordQueue(AbstractGetWordQueue getWordQueue)
//{
// m_getWordQueue = getWordQueue;
//}
//public Queue<WordsInfo> _GetWordQueue()
//{
// return m_getWordQueue._GetWordQueue();
//}
/// <summary>
///返回一个单词队列
/// </summary>
/// <param name="getWordQueue"> 给予想要得到哪一个游戏的队列</param>
/// <returns></returns>
public static Queue<WordsInfo> _GetWordQueue(AbstractGetWordQueue getWordQueue)
{
m_getWordQueue = getWordQueue;
return m_getWordQueue._GetWordQueue();
}
}
//由于每一个游戏都有他自己的队列,所以当有很多队列时我们就需要不停的If判断,这样很愚蠢
public abstract class AbstractGetWordQueue
{
protected Queue<WordsInfo> m_wordQueue;
public AbstractGetWordQueue()
{
m_wordQueue = new Queue<WordsInfo>();
}
public abstract Queue<WordsInfo> _GetWordQueue();//按照3,4,5的顺序得到一个长度为100的单词序列
//获得某个单词列表里指定数量的单词
protected void _AddSomeWords(WordsInfo[] wordList, int count)
{
int length = wordList.Length;
for (int i = 0; i < count; i++)
{
m_wordQueue.Enqueue(wordList[UnityEngine.Random.Range(0, length)]);
}
}
}
//第一个游戏的队列
public class GetWordQueueInGame1:AbstractGetWordQueue
{
//这种模式是3,3,,3,4,,n,5的那种
public override Queue<WordsInfo> _GetWordQueue()
{
//加入3个数字进入队列
base._AddSomeWords(WordParse.Instance._GetWordLength(3), 1);
base._AddSomeWords(WordParse.Instance._GetWordLength(4), 1);
//AddSomeWords(m_wordLengthIs5, 2);
return base.m_wordQueue;
}
}
//第二个游戏的队列
public class GetWordQueueInGame2:AbstractGetWordQueue
{
//这种模式是3,3,,3,4,,n,5的那种
public override Queue<WordsInfo> _GetWordQueue()
{
//加入3个数字进入队列
base._AddSomeWords(WordParse.Instance._GetWordLength(5), 1);
base._AddSomeWords(WordParse.Instance._GetWordLength(6), 1);
//AddSomeWords(m_wordLengthIs5, 2);
return m_wordQueue;
}
}