设计注意的问题--《Java与模式》
1:系统设计应该达到的目标
1)可扩展性-Extensibility:新的性能可以很容易地加入到系统中去。
2)灵活性-Flexibility:可以允许代码修改平稳地发生,而不会波及到很多其他的模块,这
就是灵活性
3)可插入性-Pluggability:可以很容易地将一个类抽出去,同时将另外一个有同样接口的类
加进来。
做到这几点关键是恰当地提高软件的可维护性和可复用性。
设计原则包括:
1)“开-闭”原则 OCP
2)里氏代换原则 LSP
3)依赖倒转原则 DIP
4)接口隔离原则 ISP
5)组合/聚合复用原则 CARP
6)迪米特法则 LoD
2:开-闭原则
达到这个目的的关键在于抽象化:在java里,可以给出一个或多个抽象java类或java接口,规定出所有的具体类必须提供的方法的特征(Signature)作为系统设计的抽象层。这个抽象层预见了所有的可能扩展,因此,再任何扩展情况下都不会改变。这就使得系统的抽象层不需要修改,从而满足了“开-闭”原则的第二条:对修改关闭。
同时,由于从抽象层导出一个或多个新的具体类可以改变系统的行为,因此系统的设计对扩展是开放的,这就满足了开闭原则的第一条。
对可变性的封装原则:
3:为什么使用接口
4:抽象类的使用
针对抽象编程
正确使用继承:包括接口继承和抽象继承
什么时候使用继承:
5:里氏代换原则
6:依赖倒转原则
在面向对象的系统里,两个类之间可以发生三种不同的耦合关系
1)零耦合:即两个类没有耦合关系
2)具体耦合:具体性耦合发生在两个具体的(可实例化的)类之间,经由一个类对另外一个具体类的直接引用造成。
3)抽象耦合关系:抽象耦合关系发生在一个具体类和一个抽象类(或接口)之间,使两个必须发生关系的类之间存有最大的灵活性。
依赖倒转原则要求客户端依赖于抽象耦合。它的表述是:抽象不应当依赖于细节;细节应当依赖于抽象。
另外一种表述是:要针对接口编程,不要针对实现编程。
针对接口编程的意思就是说,应当使用java接口和抽象java类进行变量的类型声明、参量的类型声明、方法的返回类型声明,以及数据类型的转换等。
不要针对实现编程的意思就是说,不应当使用具体java类进行变量的类型声明、参量的类型声明、方法的返回类型声明、以及数据类型的转换等。
要保证做到这一点,一个具体java类应当只实现java接口和抽象java类声明过得方法,而不应当给出多余的方法。
变量被声明时的类型叫做变量的静态类型,或明显类型;而变量所引用的对象的真实类型叫做变量的实际类型。如
List employees = new Vector();
//employees变量的静态类型是List,而它的实际类型是Vector
1)引用对象的抽象类型
在很多情况下,一个java程序需要引用一个对象。这个时候,如果这个对象有一个抽象类型的话,应当使用这个抽象类型作为变量的静态类型。这就是针对接口编程的含义。
只要一个被引用的对象存在抽象类型,就应当在任何引用此对象的地方使用抽象类型,包括参量的类型声明、方法返回类型的声明、属性变量的类型声明等。
怎样做到依赖倒转原则:
以抽象方式耦合是依赖倒转原则的关键。由于一个抽象耦合关系总要涉及具体类从抽象类继承,并且需要保证再任何引用到基类的地方都可以改换成其子类,因此,里氏代换原则是依赖倒转原则的基础。
在抽象层次上的耦合虽然有灵活性,但也带来了额外的复杂性。在某些情况下,如果一个具体类发生变化的可能性非常小,那么抽象耦合能发挥的好处便十分有限,这时使用具体耦合反而会更好。