《大话设计模式》
- [序 为什么要学设计模式](#序 为什么要学设计模式)
- [第0章 面向对象基础](#第0章 面向对象基础)
-
- 什么是对象?
- 什么是类?
- 什么是构造方法?
- 什么是重载?
- 属性与字段有什么区别?
- 什么是封装?
- 什么是继承?
- 什么是多态?
- 抽象类的目的和特点是什么?
- 什么是接口?
- 抽象类与接口的区别?
- [什么是 ArrayList,它的优缺点是什么?](#什么是 ArrayList,它的优缺点是什么?)
- 什么是泛型?
- [第1章 简单工厂模式](#第1章 简单工厂模式)
- [第2章 策略模式](#第2章 策略模式)
- 持续更新中...
序 为什么要学设计模式
重要的不是你将来会不会用到这些模式,而是通过这些模式让你找到"封装变化"、"对象间松散耦合"、"针对接口编程的感觉",从而设计出易维护、易拓展、易复用、灵活性好的程序。
第0章 面向对象基础
什么是对象?
一切事物皆为对象。对象就是可以看到、感觉到、听到、触摸到、尝到或闻到的东西。准确地说,对象是一个自包含的实体,用一组可识别的特性和行为来标识。
什么是类?
类就是具有相同的属性和功能的对象的抽象的集合。
什么是构造方法?
又叫构造函数,其实就是对类进行初始化。构造方法与类同名,无返回值,不需要 void,在 new 的时候被调用。
什么是重载?
重载可在不改变原方法的基础上,新增功能。要求方法名相同,参数类型或个数不同。
属性与字段有什么区别?
属性是一个或一对方法,即属性适合于以字段的方式使用方法调用的场合;
字段是存储类要满足其设计所需要的数据,字段是与类相关的变量;
如:shoutNum 是私有的字段,对应地,ShoutNum 是共有的对外属性。
什么是封装?
假设我们的房子是一个类的实例,室内的装饰只能供住户看到,外人无法透过墙看到内部的细节;但与此同时,房子会安置门窗,相当于对外提供接口,可以访问内部的数据。
每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装。它的好处有:
- 解耦
把属于一个类的信息提取出来。就好比居委会的公共电视放在你家,别人家都没有,邻居都来你家看电视。你肯定不想这样,我们就应该把公共电视放在居委会。
-
类的内部实现可以自由修改
-
类具有清晰的对外接口
什么是继承?
继承定义了类如何相互关联,共享特性。"is a" 的关系,继承的特点:
- 子类拥有父类非 private 的属性和功能;
- 子类拥有自己的属性和功能,即可以拓展;
- 子类可以以自己的方法实现父类的功能(方法重写)
什么是多态?
多态表示不同的对象可以执行相同的动作,但通过自己的实现代码来执行。特点:
-
子类以父类的身份出现;
Animal cat = new Cat();
-
子类在工作时以自己的方式实现;
-
子类以父类的身份出现时,子类特有的属性和方法不能使用。
(还是没悟)
抽象类的目的和特点是什么?
抽象类应该拥有尽可能多的共同代码,拥有尽可能少的数据。
- 抽象类不能被实例化
- 抽象方法是必须被子类重写的方法
- 如果类中包含抽象方法,那么类就必须定义为抽象类
什么是接口?
接口是把隐式公共方法和属性组合起来,以封装特定功能的一个集合。
- 不能实例化
- 没有构造方法
- 没有字段
- 没有修饰符
- 不能声明为虚拟或静态
抽象类与接口的区别?
- 抽象类是对类(整体)的抽象,接口是对行为(局部)的抽象
- 抽象类是自底向上抽象出来的,接口是自顶向下设计出来的
什么是 ArrayList,它的优缺点是什么?
ArrayList 是包 java.util.ArrayList 下的一部分,使用大小可按需动态增加的数组实现 Collection 接口。
优点:
- 大小按需动态增加,初始为 0
- 随意添加或移除某一范围元素
缺点:
- ArrayList 类型不安全,在它眼中所有元素都是 Object,对于不同类型的元素,编译时没问题,运行时报错
- 对于任意类型,都需要装箱拆箱,造成性能损耗
装箱
java
int i = 123;
Object o = (Object)i;
拆箱
java
o = 123;
int i = (int)o;
什么是泛型?
泛型是具有占位符(类型参数)的类、结构、接口和方法。用法是在 ArrayList 后面加上"",二者在功能上是一样的,不同点在于泛型在声明和实例化时都需要指定其内部项的数据或对象类型。这就避免了上面提到的安全问题和性能损耗。
第1章 简单工厂模式
这是一个逐步优化的过程
封装思想的实现?
业务逻辑与界面逻辑分开,降低耦合
继承思想的实现?
修改任一算法,不需要提供其他算法的代码
简单工厂模式(多态思想)的实现?
明确工厂要实例化的对象
UML类图的六种箭头?
依赖:动物 依赖 氧气
java
abstract class Animal {
public metabolism(Oxygen oxygen) { // 新陈代谢
}
}
关联:企鹅 关联 气候
含义:"了解",企鹅了解气候
java
class Penguin {
private Climate climate;
}
泛化:鸟 泛化 动物
java
class Brid extends Animal {
}
实现:大雁 实现 飞翔
java
class WideGoose implements IFly {
}
聚合:雁群 聚合 大雁
含义:弱的"has a",雁群包含大雁,但大雁不是雁群的一部分(理解不了?看下面的组合就明白了!)
与图中箭头方向相反,即空心菱形在雁群一侧
java
class WideGooseAggregate {
private WideGoose[] arrayWideGoose;
}
组合:鸟 组合 翅膀
含义:强的"has a"
java
class Bird {
private Wing wing;
public Bird() {
// Bird初始化时,Wing同时生成
wing = new Wing();
}
}