关于基本的OOP特征:
OOP的几大特征是抽象 继承 封装 多态。
我们把共同的部分抽象出来作为抽象类的存在,使用继承和接口来实现多态,然后私有的部分封装起来。一定程度上说,这些概念都是简单的设计模式。
设计原则1:
找出应用中可能需要变化的部分,把他们独立出来,不要和那些不需要变化的部分融合在一起。
设计原则2:
针对接口编程,而不是针对实现编程。
这里的接口包含抽象类。
设计原则3:
多用组合 少用继承。
组合和继承都能作为将不变的代码和变化的代码分开的方式,但是组合更加灵活,可以将一个依赖的行为封装为一个类,然后通过接口的方式引入,这样不会依赖于类的层级结构,而且可以在运行的时候动态改变(通过set方法改变依赖的组合对象)。
通俗的讲,继承是一种"是一个"的关系,组合是一种"有一个"的关系,大部分情况下我们需要的都是"有一个"。
策略模式:
定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。
个人觉得,一定程度上说,策略模式就是组合的简单实用场景。如,鸭子的"叫"行为,不同的鸭子这种行为变现不同,有的呱呱叫,有的不会叫,我们把这种行为设置为一个接口,然后定义几种不同的叫的实现,以组合的方式注入到不同的鸭子里。策略模式常见到都不能认为是一种模式了,已经是一种通用的编码方式了。
观察者模式
有时被称作发布/订阅((pub/sub))模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
在发布订阅模式的说法中,发布者发布pubscribe消息,订阅者订阅subscribe消息。
在观察者模式的说法中,分为主题(Subject),观察者(Observer)。
其中主题(Subject)的接口是:
- 增加观察者(Observer接口)
- 移除观察者
- 向观察者(们)发出通知
观察者(Observer)的接口是:
- update方法。接收主题的通知。
java内置了观察者模式,其中:
java.util.Observable类代表主题。方法如下:
构造方法摘要 | |
Observable() |
方法摘要 | |
void | addObserver(Observer o) |
protected void | clearChanged() |
int | countObservers() |
void | deleteObserver(Observer o) |
void | deleteObservers() |
boolean | hasChanged() |
void | notifyObservers() |
void | notifyObservers(Object arg) |
protected void | setChanged() |
public interface Observer接口代表观察者。方法如下:
方法详细信息 |
Object arg)
只要改变了 observable 对象就调用此方法。应用程序调用 Observable 对象的 notifyObservers 方法,以便向所有该对象的观察者通知此改变。
参数:
o - observable 对象。
arg - 传递给 notifyObservers 方法的参数。