前人说:一张图胜过万语千言。UML类图无疑为代码的实现过程提供了便利的方便,因此掌握一些UML类图与代码之间的转换是学习的基础。
【继承&实现】
在原型模式当中,具体原型继承原型:
Prototype父类: ConcretePrototypeA子类:
abstract class Prototype class ConcreteProtypeA:Prototype
{ {
private string ID; public ConcreteProtypeA(string id):base(id)
public Prototype(string id) { }
{ }
this.id=ID;
}
}
子类继承父类时不能够直接重写父类的构造函数,因此采用base的方式来调用。但有时候父类没有写入构造函数,子类继承父类不必要调用父类的构造函数,而是采用自身默认的构造函数。
根据合成复用原则,类的继承级别不应该过多,那样势必会造成系统体系结构过于庞大,增大类之间的耦合程度,方法调用混乱,不易修改的问题。
【关联&聚合&组合】
聚合与组合可以看做关联的两种特殊表现形式,因此在实现上是一致的:
方式一:直接引用
企鹅类中:
class penguin
{
private Climate climate; //直接引用气候类
}
方式二:实例化引用
上图中采用关联和组合关系都可以,只是组合比关联更加具体确切。
Facade类:
class Facade
{
SubSystemOne sbo;
SubSystemTwo sbw;
SubSystemThree sbe;
public Facade()
{
sbo=new SubSystemOne();
sbw=new SubSystemTwo();
}
}
引用过程应该注意应用类型,假如有三重继承关系,关联类处在第二层,则多采用protect类型;
方式三 数组的使用
当一个类是由一组相同类组合而成时,就要考虑数组的引用了:
class WideGooseAggregate
{
private WideGoose [ ] arrayWideGoose;
}
双重关联
在经典的代理模式当中,代理一方面要实现接口,一方面要关联追求者,而追求者关联于Schoolgirl
class Pursuit:IGiveGift //继承与实现接口相同
{
SchoolGirl mm;
public Persuit(SchoolGirl mm)
{
this.mm=mm;
}
}
class Proxy:IGiveGift
{
Pursuit gg; //关联追求者时引用puisuit类
public Proxy(SchoolGirl mm) //代理要最终引入实现追求者的方法,因此通过引用女孩对象给追求者
{
gg=new Pursuit(mm); //最终实现双重关联
}
}
【依赖】
依赖关系在工厂家族中表现的尤为突出,具体的方法类相当于加工制造的机器,具体工厂类相当于具体的加工车间,车间依赖机器进行加工,实现功能。
interface Factory
{
operation createoperation(); //直接引用operation类定义具体实现方法;
}
class AddFactory:Factory
{
public operation createopreation() //类似于重写
{
return new operationAdd();//通过接口直接调用具体机器(具体操作类)中的方法
}
}
【继承VS关联VS依赖】
继承和实现是一种很强关系,子类继承父类的方法,因此没有必要在子类中引用父类的方法。但是,构造函数却不能被继承,这样可以使子类继承父类方法的同时保持自己的个性。
关联相对于继承与依赖处于中等地位的类间关系,因此在代码实现过程中,多采用将父类实例化后引出到构造函数中,这样就可以供给整个父类使用了。
依赖则是三者中最弱的关系,因此将引用过程放到具体的实现方法中,而不是像关联一样供给类中所有函数成员使用。
【总结】
UML类图的代码实现过程相对好理解但是不容易记忆,只有多运用到实际才能熟练掌握!它是程序编写和设计模式基础,应该引起重视!