设计模式奠基石——UML关系转化为代码

1、继承关系(泛化关系)

说明】:继承关系是子类(派生类)继承父类(基类),或者子接口继承父接口的关系。即子类对象“is
a
” 父类对象,比方鸟是动物。

UML图】:

图解:Animal为父类,Bird类、Fish类、Dog类分别继承了Animal类,它们不仅继承了Animal的公用方法Breath(),同一时候也依据自己的实际须要拓展了相关方法(Fly()方法、Swim()方法、Run()方法)。

相应代码】:

    //Animal类(父类):
       class Animal
       {
        public void Breath() { }
       }
    //Bird类、Fish类和Dog类(子类):
       class Bird : Animal
      {
        public void Fly() { }
      }
      class Fish : Animal
      {
        public void Swim() { }
      }
      class Dog : Animal
      {
        public void Run() { }
      }

【画龙点睛】:

★说明子类能够继承全部父类非private的属性和方法,而且能够依据实际情况进行拓展(添加?属性或方法),如上例中的Fly()方法就是鸟类对动物类的拓展;

★类仅仅能够有单继承(一个子类仅仅能够继承一个父类,一个父类能够由多个子类继承),接口能够有多继承(一个子接口能够继承多个父接口)。

        2、实现关系

【说明】:实现关系就是类实现接口的关系。下面引用《大话设计模式》中的样例来说明。

UML图】:

                                                                                                          

       图解:机器猫、孙悟空、猪八戒都能够变出东西来,但又由于其它动物并不像他们三个一样具有这样的超能力,因此并不能直接把这种方法加到父类Animal中去,而须要把“变出东西”这样的方法抽象出一个名为“变东西”的接口,到时候让具有这样的超能力的动物们(比方机器猫、孙悟空、猪八戒)直接去实现这个接口。

      【相应代码】: 
   

   //Animal类、Cat类、Monkey类、Pig类、叮当猫类的代码省略
    interface IChange
    {
        string ChangeThing(string thing);
    }
    class SunWukong:Monkey,IChange//孙悟空继承与猴类,并实现IChange接口
    {
        public string ChangeThing(string thing)  //此处为实现接口的方法,注意不能加override修饰符
        {
            return "我老孙有七十二般变化,能够变出" + thing;
        }
    }
    class ZhuBajie : Pig, IChange//猪八戒继承与猪类,并实现IChange接口
    {
        public string ChangeThing(string thing) //此处为实现接口的方法,注意不能加override修饰符
        {
            return "我老猪有三十六般变化,能够变出" + thing;
        }
    }

      【画龙点睛】:

★类能够实现多重接口,即一个类实现多个接口;

★由于接口中的方法用来定义对象之间通信的契约,假设指定接口中的方法为私有或保护就没有意义了,所以它们默觉得公有方法,即接口不能用new、public、protected、internal、private等修饰符。

★为了区分类和接口,接口名称一般都以“I”作为首字母(当然不这样声明也能够)。

(很多其它注意事项可參考百度百科“接口”)

        3、依赖关系

【说明】:假设一个类A须要用到还有一个类B,或者说一个类A负责构造类B的实例时,则称类A依赖类B,即A类对象“use
a
” B类对象。比方人写字须要用到笔,那这个关系就是人类依赖笔类;又比方机器造零件,那机器类就依赖零件类(本例參考简单工厂模式)。

UML图】:

       人写字的UML图:

   

       机器造零件的UML图:

      【相应代码】:

       例1:人写字的代码(此处体现依赖的方式为:Pen是People中一个方法中的变量)

    class People
    {
        public void Write()
        {
            Pen pen=new Pen();
            pen.Write();
        }
    }
    class Pen
    {
        public void Write(){}
        public void Draw(){}
    }

例2:机器造零件的代码(此处体现依赖的方式为:Part是Machine中一个方法中返回值)

    class Part         //零件类
    {
       private string type;
    }
    class PartA : Part //零件A类(继承零件类)
    { }
    class PartB : Part //零件B类(继承零件类)
    { }
    class Machine     //机器类(职责:依据要求选择性地生产零件A或零件B)
    {
        public static Part CreatePart(string type)
        {
            Part part = null;
            switch (type)
            {
                case "A":
                    part = new PartA();
                    break;
                case "B":
                    part = new PartB();
                    break;
            }
            return part;
        }
    }

      【画龙点睛】:

★假如A依赖B,依赖关系代码表现形式:

1、B是A中方法的变量;

2、B是A中方法的返回值;

3、B是A中方法的參数。

        4、关联关系

【说明】:关联关系简单来说就是一个类A“知道”还有一个类B的时候,则类A关联类B,UML图表现为实线箭头由类A指向类B。比方很多动物都能够预知地震、海啸等自然灾害,狗在自然灾害前会狂吠不止、老鼠在震前会出窝乱窜……

UML图】:

       

      【相应代码】:

    class Disaster
    {
        private string name;
        public Disaster(string name)
        {
            this.name = name;
        }
    }
    class Mouse
    {
       private Disaster disaster;
       public Disaster TheDisaster
       {
          get{return disaster;}
          set{this.disaster = value;}
        }
        public void Run(){}    } 

    class Dog
    {
        private Disaster disaster;
        public Disaster TheDisaster
        {
           get{return disaster;}
           set{this.disaster = value;}
        }
        public void Bark(){}    }
    //client代码
    static void Main(string[] args)
        {
         Disaster disaster=new Disaster("Typhoon");
         Mouse mouse=new Mouse();
         Dog dog=new Dog();
         mouse.TheDisaster=disaster;
         dog.TheDisaster=disaster;
         if(mouse.TheDisaster!=null)
         mouse.Run();
         if(dog.TheDisaster!=null)
         dog.Bark();
        }

      【画龙点睛】:

       ★关联关系有单向关联、双向关联、自身关联、多维关联等等。代码体现为,哪个类关联还有一个类就直接在类中调用那个类就可以;

★关联和依赖的差别:

(1)从类的属性是否添加?的角度看:

发生依赖关系的两个类都不会添加?属性。当中的一个类作为还有一个类的方法的參数或者返回值,或者是某个方法的变量而已。

发生关联关系的两个类,当中的一个类成为还有一个类的属性,而属性是一种更为紧密的耦合,更为长久的持有关系。

(2)从关系的生命周期来看:

依赖关系是仅当类的方法被调用时而产生,伴随着方法的结束而结束了。

关联关系是当类实例化的时候即产生,当类销毁的时候,关系结束。相比依赖讲,关联关系的生存期更长。

        5、聚合关系:

【说明】:假设A对象能够包括B对象,可是B对象不一定要成为A对象的组成部分,那么A对象与B对象之间的关系为聚合关系,即A对象“contain a” B对象,比方一辆自行车包括两个车轮,但这两个车轮不一定要安装在这两自行车上。

UML图】:

    

      【相应代码】:   

    class Wheel{ }
    class Bicycle
    {
        private Wheel BicycleWheel;
        public Wheel BicycleWheel
        {
            set{BicycleWheel=value;}
            get{return BicycleWheel;}
        }
    }

      【画龙点睛】:

★普通关联关系的两个类处于同一层次上,而聚合关系的两个类处于不同的层次,一个是总体,一个是部分,是一种弱的“拥有”关系。

★A对象能够包括B对象,但B对象不是A对象的组成部分。详细表现为,假设A由B聚合成,表现为A包括有B的全局对象,可是B对象能够不在A创建的时刻创建。

        6、组合关系

【说明】:假设A类对象包括B类对象,并且B类对象一定要是A类对象的组成部分,那么A类对象与B类对象之间的关系为聚合关系,即A类对象“contain
a
” B类对象,比方一个健康的人有两条胳膊和两条腿,并且这两条胳膊和两条腿一定仅仅属于这个人。即A对象“has a” B对象。

UML图】:

       

      【相应代码】:    

     class Arm { }
    class Leg { }
    class People
    {
        private Arm myArm;
        private Leg myLeg;
        public People()
        {
            myArm=new Arm();
            myLeg=new Leg();
        }
    }

      【画龙点睛】:

       ★组合是比聚合关系强的关系。它要求普通的聚合关系中代表总体的对象负责代表部分的对象的生命周期。组合关系是一种强的“拥有”关系,体现了严格的部分和总体的关系,部分和总体的生命周期一致。假设A由B组成,表现为A包括有B的全局对象,而且B对象在A创建的时刻创建。

★聚合和组合的差别:请參见浅谈UML中的聚合与组合

在这几种关系中,它们的耦合强度由强到弱为:泛化=实现>组合>聚合>关联>依赖。设计模式就如同搭积木,这几种关系就如同积木,设计模式的作用无非就是为了将这几种关系组合,最大化减少程序耦合度,使代码结构达到最优,便于应对以后的需求变更。

须要注意的是,当中的关联关系、聚合关系、组合关系的代码体现有一个相似点,就是都是一有个类作为还有一个类的成员。这一点须要用心理解清楚,不要混淆。

大家假设有什么好的说明样例或者建议请您提出宝贵的意见,谢谢。

【注:本文代码均用C#来实现,与其它语言可能会有差异(如java中子类继承父类使用“class 子类 extends 父类”的结构;java中类实现接口使用“class 类 implements 接口”的结构等】

设计模式奠基石——UML关系转化为代码

时间: 2024-08-25 07:40:45

设计模式奠基石——UML关系转化为代码的相关文章

设计模式奠基石——UML转化为代码

1.继承关系(泛化关系) [说明]:继承关系是子类(派生类)继承父类(基类),或者子接口继承父接口的关系.即子类对象"is a" 父类对象,比如鸟是动物. [UML图]: 图解:Animal为父类,Bird类.Fish类.Dog类分别继承了Animal类,它们不仅继承了Animal的公用方法Breath(),同时也根据自己的实际需要拓展了相关方法(Fly()方法.Swim()方法.Run()方法). [对应代码]: //Animal类(父类): class Animal { publi

设计模式之UML类图的常见关系

设计模式之UML类图的常见关系 本文来自转载 烧点饭博客 本篇会讲解在UML类图中,常见几种关系: 泛化(Generalization),依赖(Dependency),关联(Association),聚合(Aggregation),组合(Composition). 1.泛化关系 泛化关系是继承或实现的关系,是is a关系,具体表现为类与类的继承,接口与接口的继承,类对接口的实现关系. 2.依赖关系 依赖关系表示为一个类使用另一个类,这种使用关系是具有偶然性的.临时性的.非常弱的,一个类的变化会影

设计模式中的关系在代码中的实现

我们都学过UNL,其中类图中有6类关系:泛华(继承).实现.关联.组合.聚合.依赖.由于他们之间也存在各种联系,我就将他们分为了4大类:依赖.关联.继承.实现. 整理如图: 从这个图中,我们就可以看出我是如何划分的了:聚合和组合是关联的特殊形式,所以就这样划分了. 我们知道,这6个关系的耦合的耦合度:继承=实现<依赖<关联<聚合<组合. 那么下一步,我们就看看,他们在设计模式的代码中是怎样实现的. 1.依赖关系 依赖关系的定义很绕口,其实说白了就是:一个对象依赖于另一个对象的服务.

设计模式学习---UML常见关系的实现

一.UML基本构造 UML的基本构造含3种: (1) 事物(4种):结构事物,行为事物,分组事物,注释事物 (2) 关系(4种):泛化关系,实现关系,依赖关系,关联关系 (3) 图(10种):用例图,类图,对象图,包图,组件图,部署图,状态图,活动图,序列图,协作图 事物是对模型中最具代表性的成分的抽象:关系把事物结合在一起:图聚集了相关的事物. 二.UML中关系 UML 中关系描述的是:类与类, 类与接口, 接口与接口之间的关系.UML中的关系主要包括: 泛化(generalization) 

设计模式-UML关系基础

UML关系基础 类之间的关系 泛化 类在继承中表现为泛化和实现. 继承关系为is-a的关系,两个对象之间用is-a表示为继承关系. eg,自行车是车,猫是动物. 泛化关系用空心箭头表示 如下图. A继承自B 用空心箭头表示A继承自B 泛化关系表示为继承抽象类. 抽象类可以继承一个具体的类的. 抽象类可以被实体类继承 抽象类可以被其他抽象类继承 实现关系 实现关系用空心箭头表示. 即指向C++中的抽象类(通过纯虚函数实现),java中的接口,表示实现关系. 即,无法直接定义对象的都被成为抽象类.

设计模式间的关系

从七月份开始一直到九月底才看完设计模式,在这个过程中我不敢说我已经掌握了那本书里面的内容,或者说1/5,没能力说也没有资格说.但是结果不重要,重要的是这个过程我的收获!主要包括如下几个方面: 1.认识了这么多设计模式.刚刚接触java没多久就在学长那里听过设计模式的大名,但是由于能力有限,一直不敢触碰.而今有幸将其都认识了. 2.开始有设计的理论了.在接触设计模式之前没有怎么想过设计方面东东,看到问题就立马动手解决,没有想到怎么样来设计更好,如何来是这块更加优化.漂亮. 3.开始考虑系统的可扩展

设计模式前言——UML类图

设计模式前言--UML类图 一.UML类图 1.类 类(Class)封装了数据和行为,是面向对象的重要组成部分,是具有相同属性.操作.关系的对象集合的总称.在系统中,每个类都具有一定的职责,职责指的是类要完成什么样的功能,要承担什么样的义务.一个类可以有多种职责,设计得好的类一般只有一种职责.在定义类的时候,将类的职责分解成为类的属性和操作(即方法).类的属性即类的数据职责,类的操作即类的行为职责.设计类是面向对象设计中最重要的组成部分,也是最复杂和最耗时的部分.在软件系统运行时,类将被实例化成

设计模式中类的关系

在java以及其他的面向对象设计模式中,类与类之间主要有6种关系,他们分别是:依赖.关联.聚合.组合.继承.实现.他们的耦合度依次增强. 1. 依赖(Dependence)  依赖关系的定义为:对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系.定义比较晦涩难懂,但在java中的表现还是比较直观的:类A当中使用了类B,其中类B是作为类A的方法参数.方法中的局部变量.或者静态方法调用.类上面的图例中:People类依赖于Book

23种常用设计模式的UML类图

本文UML类图参考<Head First 设计模式>(源码)与<设计模式:可复用面向对象软件的基础>(源码)两书中介绍的设计模式与UML图. 整理常用设计模式的类图,一方面是为了练习UML,另一方面可以重新思考设计模式.当然,整理完成后可以作为一份手册供今后翻阅. 绘图工具:Visual Studio 2015 一.创建型 Factory Method(工厂方法) 定义:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个.工厂方法让类把实例化推迟到子类. 类图: Abstr