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.代码
- public class Driver {
- private String name;
-
- public void drive(Vihecle vihecle, Address address) {
- System.out.println(this.name + vihecle.go(address));
- }
-
- public Driver(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- }
- public class Address {
- private String name;
-
- public Address(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- }
- public abstract class Vihecle {
- public abstract String go(Address address);
- }
- public class Car extends Vihecle {
- public String go(Address address) {
- return "开车去" + address.getName();
- }
- }
- public class Test {
- public static void main(String[] args) {
- Driver driver = new Driver("老张");
- Vihecle vihecle = new Car();
- Address address = new Address("东北");
- driver.drive(vihecle,address);
- }
- }output:
- 老张开车去东北
5.思考
a.站在用户的角度设计
b.修改不如添加,说的是方法。目前不太明白
c.没有完美的设计,设计不能一步到位。