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

原文地址:https://www.cnblogs.com/maying3010/p/6284492.html