设计模式基础---UML关系的代码实现

          前人说:一张图胜过万语千言。UML类图无疑为代码的实现过程提供了便利的方便,因此掌握一些UML类图与代码之间的转换是学习的基础。

【继承&实现】

                                                                设计模式基础---UML关系的代码实现_第1张图片
         在原型模式当中,具体原型继承原型:
         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;  //直接引用气候类
       }

      方式二:实例化引用
    设计模式基础---UML关系的代码实现_第2张图片设计模式基础---UML关系的代码实现_第3张图片
      上图中采用关联和组合关系都可以,只是组合比关联更加具体确切。
       Facade类:
       class Facade
       {
             SubSystemOne sbo;
             SubSystemTwo sbw;
             SubSystemThree sbe;
             public Facade()
             {
                     sbo=new SubSystemOne();
                     sbw=new SubSystemTwo();
             }
       }
    引用过程应该注意应用类型,假如有三重继承关系,关联类处在第二层,则多采用protect类型;

设计模式基础---UML关系的代码实现_第4张图片
设计模式基础---UML关系的代码实现_第5张图片
     方式三 数组的使用
                                                            
      当一个类是由一组相同类组合而成时,就要考虑数组的引用了:
      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);   //最终实现双重关联
                 }
         }
       

【依赖】

                               设计模式基础---UML关系的代码实现_第6张图片
       依赖关系在工厂家族中表现的尤为突出,具体的方法类相当于加工制造的机器,具体工厂类相当于具体的加工车间,车间依赖机器进行加工,实现功能。
       interface Factory
       {
                 operation createoperation();   //直接引用operation类定义具体实现方法;
       }
      class AddFactory:Factory
      {
                public operation createopreation()    //类似于重写
                {
                           return new operationAdd();//通过接口直接调用具体机器(具体操作类)中的方法
                }
      }

【继承VS关联VS依赖】

        继承和实现是一种很强关系,子类继承父类的方法,因此没有必要在子类中引用父类的方法。但是,构造函数却不能被继承,这样可以使子类继承父类方法的同时保持自己的个性。
        关联相对于继承与依赖处于中等地位的类间关系,因此在代码实现过程中,多采用将父类实例化后引出到构造函数中,这样就可以供给整个父类使用了。
        依赖则是三者中最弱的关系,因此将引用过程放到具体的实现方法中,而不是像关联一样供给类中所有函数成员使用。

【总结】

       UML类图的代码实现过程相对好理解但是不容易记忆,只有多运用到实际才能熟练掌握!它是程序编写和设计模式基础,应该引起重视!

你可能感兴趣的:(设计模式,继承,面向对象,架构,结构)