最近准备开始机房收费系统的重构了,但是还没开始就发现自己无从下手。所以,再一次总结一下设计模式,希望从中能找到灵感。
继承关系:
UML图:
代码实现:
........
//老师的抽象类
abstractclassTeacher
{
protectedstringname;
publicTeacher (string name )
{
this.name= name;
}
abstractpublicvoidTeache();
}
//数学老师的抽象类
classMathTeacher:Teacher
{
publicMathTeacher(string name)
:base(name)
{ }
publicoverridevoidTeache()
{
thrownewNotImplementedException();
}
}
...........
总结:在继承关系中主要涉及到了,构造函数的调用、抽象方法的重写。
聚合关系
UML图
代码实现:
//备忘录类
class Memento
{
private string state;
public Memento(string state)
{
this.state =state ;
}
public string State
{
get { return state; }
}
}
//管理者类
class Caretaker
{
private Memento memento;<span style="white-space:pre"> </span>//定义一个Memento类型的参数
public Memento Memento<span style="white-space:pre"> </span>//定义一个方法,得到或设置Memento的值
{
get { return memento; }
set { memento = value; }
}
}
总结:聚合关系就是简单的将Memento类中需要保存的信息交给了Caretaker类(即在Caretaker类中定义一个Memento类型的参数)。
组合关系
说明:组合关系是一种耦合度较强的关系。
UML图:
代码实现:
//工作经历类
class WorkExperience:ICloneable
{
private string workDate;
public string WorkDate
{
get { return workDate; }
set { workDate = value; }
}
private string company;
public string Company
{
get { return company; }
set { company = value; }
}
public Object Clone()
{
return (Object)this.MemberwiseClone();
}
}
//简历
class Resume:ICloneable
{
private string name;
private string sex;
private string age;
private WorkExperience work;
//***********************************************************
public Resume (string name)<span style="white-space:pre"> </span>
{
this.name = name;
work = new WorkExperience();<span style="white-space:pre"> </span>//在简历类初始化的时候,也将工作经历类实例化了
}
//********************************************************
private Resume (WorkExperience work)
{
this.work = (WorkExperience)work.Clone();
}
//设置个人信息
public void SetPersonalInfo(string sex,string age)
{
this.sex = sex;
this.age = age;
}
//******************************************************
//设置个人经历
public void SetWorkExperience(string workDate,string Company)
{
work.WorkDate = workDate;
work.Company = Company;
}
//********************************************************
//显示
public void Display()
{
Console.WriteLine("{0}{1}{2}",name ,sex ,age );
Console.WriteLine("{0}{1}",work.WorkDate ,work.Company);
}
public Object Clone()
{
//return (object)this.MemberwiseClone();
Resume obj = new Resume(this.work);
obj.name = this.name;
obj.sex = this.sex;
总结:组合关系中体现了较强的耦合关系,上例中通过在简历类中将工作经历类实例化,从而简历了强的拥有关系。然后在在简历类中给工作经历类中的属性赋值。
依赖关系
说明:表明一个类的存在必须以另一个类的存在为条件。
UML图:
代码实现:
//用户
public class User
{
private string name;
public User (string name )
{
this.name = name;
}
public string Name
{
get { return name; }
}
}
//网站类
abstract class Website
{
public abstract void Use(User user);
}
总结:在依赖关系中,网站类中的某一个方法一定是用“用户类”作为参数使用的。所以他们就像动物和空气一样,动物依赖着空气重的氧气生存。