面向对象程序的设计原则--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(实现)。

  使用组合建立系统具有很大的弹性,不仅可以将算法族封装成类,更可以“在运行时动态地改变行为”,只要组合的行为对象符合正确的接口标准即可。

  ==================================================================

  =策略模式,定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户 =

  ==================================================================

原文地址:https://www.cnblogs.com/benbenzhu/p/3363495.html