zoukankan      html  css  js  c++  java
  • Think In OO

    Think In OO

    概要

    最近在学习设计模式,看了一下马士兵的java教程(教的真的挺好的)。在教授设计模式之前先教了Think In OO(面向对象的思想)

    1.面向对象

    把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象归纳为类(class),通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance)实现类的特化(specialization)/泛化(generalization),通过多态(polymorphism)实现基于对象类型的动态分派(dynamic dispatch)。

    作者:Milo Yip
    链接:https://www.zhihu.com/question/19854505/answer/23421930
    来源:知乎

    2.背景

    把下面一句话使用面向对象的思想设计

    老张开车去东北

    3.设计

    考虑类
    不要设计的太宽:人 ,也不要设计的太窄:老张
    类的属性(成员变量)
    与类一样是名词,但需要考虑这是类还是类的属性。
    要从需求中考虑属性,不要把该需求不需要的但带类的确有属性考虑进来。如:性别、年龄等
    类的方法
    方法一般是动词。
    设计时以该类(对象)为主语考虑需要的方法。如:Driver类中方法为diive(),Vihecle类的go()
    类之间的关系
    不要说,自己也有点没有弄明白。
    在学习UML时,记得有说过:依赖(Spring中的IOC)、聚合等等,不明白。
    还有关系放在方法中(作为参数)、放在类中(作为属性),也不明白。如:把vihecle对象放在Driver的属性中,还是放在drive()的参数中。
    封装
    降低耦合度。如把Driver类中的开车封装成drive()方法
    继承
    方便代码重用,为多态做准备(自己觉得)。如Car类继承自Vehicle类
    多态
    方便代码重用。个人觉得在面向对象中最重要的就是多态,感觉其他的都是在为它作准备。
    接口还是抽象类
    在我们设计中,可能对于一些类,该类有方法但没有具体的实现。我们是该把它设计成接口还是抽象类呢?
    类:一种对象(事物)的抽象。如:Vihecle类是交通工具的一种对象。
    接口:许多种的对象(事物)的一些共同的特征。如:Movable接口是能够移动的许多类的共同特征罢了。

    4.代码

    1. public class Driver
    2. private String name; 
    3.  
    4. public void drive(Vihecle vihecle, Address address)
    5. System.out.println(this.name + vihecle.go(address)); 

    6.  
    7. public Driver(String name)
    8. this.name = name; 

    9.  
    10. public String getName()
    11. return name; 

    12.  
    13. public void setName(String name)
    14. this.name = name; 

    15.  

    1. public class Address
    2. private String name; 
    3.  
    4. public Address(String name)
    5. this.name = name; 

    6.  
    7. public String getName()
    8. return name; 

    9.  
    10. public void setName(String name)
    11. this.name = name; 

    12.  

    1. public abstract class Vihecle
    2. public abstract String go(Address address)

    1. public class Car extends Vihecle
    2. public String go(Address address)
    3. return "开车去" + address.getName(); 


    1. public class Test
    2. public static void main(String[] args)
    3. Driver driver = new Driver("老张"); 
    4. Vihecle vihecle = new Car(); 
    5. Address address = new Address("东北"); 
    6. driver.drive(vihecle,address); 

    7. }output: 
    8. 老张开车去东北 

    5.思考

    a.站在用户的角度设计
    b.修改不如添加,说的是方法。目前不太明白
    c.没有完美的设计,设计不能一步到位。

    6.references

    https://www.zhihu.com/question/19854505

  • 相关阅读:
    [C++] 重载运算符与类型转换(1)
    [C++] 重载new和delete——控制内存分配
    [C++] 空间配置器——allocator类
    [C++] C++中的宏定义详解
    [C++] 类中的静态成员
    [Leetcode][动态规划] 第935题 骑士拨号器
    [Leetcode][动态规划] 第931题 下降路径最小和
    Pyinstaller打包django
    Python小技巧:运行目录或ZIP文件
    python实现简单动画——生命游戏
  • 原文地址:https://www.cnblogs.com/maying3010/p/6284492.html
Copyright © 2011-2022 走看看