自上次的个人版的机房收费系统后, 接下了的就是合作版的开发了.
要求是尽量添加一些设计模式,毕竟自己开发的时候用到的设计模式还是有限的,这次的重点不是在代码上.重点是
1 文档驱动;2.项目经理写文档不能讨论;3.分层开发完成完成;4.相对应的文档发给相对应的人,不能把所有文档都
发给一个人;5.尽量加设计模式;6.SVN使用;7.进度控制
针对上述要求,添加了一些设计模式.对于版本控制的问题这里不细说,后续篇章讲解
首先是
1.简单工厂
简单工厂是工厂类 需要了解所有一些运算的类
他们完成的内容不同,但是都用同一个接口,就可以用工厂的方法实现
(但不支持增加新产品,可以修改产品的具体方法)
在于简单工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
缺点:当需要增加新产品时,需要修改工厂类,不符合开放封闭原则。
2. 策略模式与工厂结合
策略模式是运用抽象的方法,将具有相同的属性和功能的对象进行抽象集合成类,如 ,打折 无论是几折,都是抽象
的.所以策略模式是对算法的抽象,分别封装起来,让他们之间相互替代,算法的变化,不会影响到使用算法的客户.
与简单工厂相结合,这样客户端认识的类就少了,只需要认识ContextFacotry就可以了
事例:
ConetextFactory money=new ConetextFactory();
如果不结合那么简单工厂就需要认识两个类,耦合比较大
Strategy money= ConetextFactory.createCash()客户端认识了两个类,strategy和ConetextFactory.
3.模板方法
模板方法是运用继承的思想,将所有重复的代码都上升到父类去,而不是让每个类都去重复.
当我们要完成一些细节层次一致的过程或是一系列步骤,但其个别的步骤在更详细的层次上实现可能不同时, 我们通常考虑用到模板的方法来处理
实例
多个人作答同样的卷子,问题都是一样的,只是每个人的答案有所不同
于是我们就可以用模板的方法,增加虚方法.
如
Class Test
{
public void TestQuestion1()
{
Console.WriteLIne("问题");
}
}
我们增加虚方法
Public Void TestQuestion1()
{
Console.wrilte("问题");
console.writeLine("答案"+Answer1());
}
Protected virtualstring Answer1()
{
return" ";
}
然后子类重写虚方法就可以把答案填上了.其他什么都不用管了.因为父类建立了所有的重复的模板了
子类有:
Clalss TestPagerA: Test
{
protected overrdie string Answer1()
{
return "b";
}
}
若多个学生答题,则只需要修改重写类的返回值就可以了.方法简单了好些吧.
所以模板方法也可以说是 定义一个操作的算法骨架, 将一些步骤延迟到了子类中. 自来可以重新定义算法的某些
特定步骤.
4.单例模式
单列模式i的应用: (SingleTon)
保证一个类仅有一个实例,并提供一个访问它的全局访问点.
Singleton |
-instance: Singleton |
-Subgketib() +GetInstance() |
|
密封类Sealed的应用
不允许重写基类的方法
密封类不能被继承 ,不会重写基类的方法。
双重锁定功能的应用 ,防止多线程同时调用singleton的getinstance方法,造成创建多个实例
运用Lock锁的方法
Private static Singleton instance;
Private static readonly object syncRoot=new object();
Private Singleton()
{}
Public static singleton Gettinstacne()
If(=null)
{
lock(syncroot)
{
if (=null)
{
instance=new singlton();
}
|
}
如果用抽象工厂,那么这个单例模式是一定要用到了,因为这样避免了很多的再次创建 工厂了.
5.职责链模式
可以设置上机准备时间(分钟)、最少上机时间(分钟)、递增时间(分钟)、固定用户半小时费用、临时用户
每小时费用。学生下机结账时,如果上机时间在准备时间内这段时间不计费,如果上机时间大于上机时间小于最少
上机时间则按最少上机时间收费,如果上机时间大于最少上机时间,则按递增时间段收费
当然了,还有先前用到的外观,抽象工厂加反射的模式.这就不重复了