面向对象程序的设计原则--Head First 设计模式笔记
一、找出应用中可能需要变化的地方,把它们独立出来,不要和那些不需要变化的代码混在一起。
把会变化的部分取出并“封装”起来,好让其他部分不会受到影响。这样,代码变化引起的不经意后果变少,系统变得更有弹性。
下面是这个原则的另一个思考方式:“把会变化的部分取出并封装起来,以便以后可以轻易地改动或扩充此部分,而不影响不需要变化的其他部分”。这样的概念很简单,机会是每个设计模式背后的精神所在。所有的设计模式都提供了一套方法让“系统中得某部分改变不会影响其他部分”。
二、针对接口编程,而不是针对是吸纳编程
“针对接口编程”真正的意思是“针对超类型编程”。“针对接口编程”,关键就在于多态。利用多态,程序可以针对超类型编程,执行时会根据实际情况执行到真正的行为,不会被绑死在超类型的行为上。“针对超类型编程”这句话,可以更明确地说成“变量的生命类型应该是超类型,通常是一个抽象类或者是一个接口,如此,只要是具体实现此超类型的类所产生的对象,都可以指定给这个变量。这也就意味着,声明类时不用理会以后执行时真正的对象类型。看看这个简单的多态例子:假设有一个抽象类Animal,有两个具体的实现(Dog和Cat)继承Animal。做法如下:
”针对实现编程“:
Dog d = new Dog();
d.bark();
但是,“针对接口/超类型编程”做法如下:
Animal animal = new Dog();
animal.makeSound();
更棒的是,子类实例化的动作不再需要在代码中硬编码,例如,new Dog(),而是“在运行时才指定具体实现的对象”。
a = getAnimal();
a.makeSound();
三、多用组合,少用继承
类之间的关系:IS-A(是一个),HAS-A(有一个)或IMPLEMENTS(实现)。
使用组合建立系统具有很大的弹性,不仅可以将算法族封装成类,更可以“在运行时动态地改变行为”,只要组合的行为对象符合正确的接口标准即可。
==================================================================
=策略模式,定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户 =
==================================================================