《Head First设计模式》读后感

来源:互联网 发布:python数据挖掘介绍 编辑:程序博客网 时间:2024/06/05 15:09
设计原则:

1. 封装变化。
注释:a. 找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。
      b. 把会变化的部分取出并封装起来,一边以后可以轻易地改动或扩充此部分,而不影响不需要变化的其他部分。

2. 针对接口编程,而不是针对实现编程。
注释:a. 行为来自超类的具体实现,或是集成某个接口并由子类自行实现而来。这两种做法都是依赖于“实现”,
      被实现绑得死死的,没办法更改行为。
      b. 针对接口编程,真正的意思是针对超类型编程,关键就在多态。利用多态,程序可以针对超类型编程,
     执行时会根据实际状况执行到真正的行为,不会被绑死在超类型的行为上。“针对超类型编程”这句话,
     可以更明确地说成“变量的生命类型应该是超类型,通常是一个抽象类或是一个接口,如此,只要是具体
     实现此超类型的累所产生的对象,都可以指定给这个变量。这也意味着,声明类时不用理会以后执行时的
     真正对象类型。
      c. 更好的是,子类实例化的动作不再需要在代码中硬编码。可以通过多态的方式动态获取实例化对象。
      d. 增加灵活性,动态设定行为。
      e. 通过委托(delegate)将动作交给其他的类实现。

3. 多用组合,少用继承。
      a. 组合可将行为委托给其他类处理。
      
4.
5.
6. 最少知识原则:只和你的密友谈话。
      a. 虽然这个原则减少了对象之间的依赖,减少了软件的维护成本;但是会导致更多的“包装”类被制造出来,
         以处理和其他组件的沟通,这可能会导致复杂度和开发时间的增加,并降低运行时的性能。
        
7. 别调用我们,我们会调用你。
注释:a. 允许底层组件将自己挂钩到系统上,但是高层组件会决定什么时候和怎样使用这些底层组件。底层组件
         可以参与计算,但是底层组件决定不可以直接调用高层组件。
      b. 和依赖倒置原则之间的关系:依赖导致原则教我们尽量避免使用具体类,而多使用抽象。而该原则是用在
         创建框架或组件上的技巧,好让底层组件能够被挂钩进计算中,而且又不会让高层组件依赖底层最贱。两者
         都是在解耦,但是依赖倒置原则更加注重如何在设计中避免依赖。改原则教我们创建一个有弹性的设计,允许
         底层结构能够相互操作,而又防止其他类太过依赖它们。
        
8. 单一责任: 一个类应该只有一个引起变化的原因。
      a. 类得每个责任都有改变的潜在区域。超过一个责任,以为这超过一个改变的区域。
      b. 尽量让每个类保持单一责任。


设计模式:
1. 策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
2. 观察者模式:
3. 装饰着模式:
4. 单件模式:确保一个类只有一个实例。
5. 命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
   补充:在许多设计模式中,都会看到控对象的使用。甚至有些时候,空对象本身也被视为一种设计模式。
6. 适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
   补充:
        * 可用使用适配器的过程:
                               a. 客户通过目标接口调用适配器的方法对适配器发出请求。
                               b. 适配器使用被适配这接口把请求转换成倍适配者的一个或多个调用接口。
                               c. 客户接受到调用的结果,但并未察觉这一切是适配器在其转换作用。
          
7. 外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
   补充:a. 外观不只是简化了接口,也将客户从组建的子系统中解耦。
         b. 外观和适配器可以包装许多类,但是外观的意图是简化接口,二适配器的意图是讲接口转换成不同的接口。
        
8. 模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在
   补充:a. 定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。
         b. "hook"(钩子),一个具体的方法,但它什么事情都不做。子类可以视情况决定要不要覆盖它。
            钩子是一种被声明在抽象类中的方法,但只有空的或者默认的实现。钩子的存在,可以让子类有能力对算法
            的不同点进行挂钩。要不要挂钩,由子类自动决定。
         c. 钩子的用途:钩子可用作条件控制。
         d. 当子类”必须“提供算法中某个方法或步骤的实现时,就使用抽象方法。如果算法的这个部分是可选的,就用钩子。
            如果是钩子的话,子类可以选择实现这个钩子但并不强制这么做。
         e. 使用钩子的真正目的是:钩子可以让子类实现算法中可选的部分,或者在钩子对于子类的实现并不重要的时候,
            子类可以对此钩子至于不理。钩子的另一个用法,是让子类能够有机会对模板方法中某些即将发生的步骤做出
            反应。钩子有能力为其抽象类做一些决定(例如:条件判断)。
        
9. 迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
   补充:a. “集合”指的是一群对象。其存储方式可以是各式各样的数据结构,例如:列表、数组、散列表,无论用什么方式存储,
            一律可以视为是集合,有时候也被称为聚合。
         b. 把游走的任务放在迭代器上,而不是聚合上,这样简化了聚合的接口和实现,也让责任各得其所。
        
10. 组合模式:允许将对象组合成属性结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
         a. 组合模式让我们能用树形方式创建对象的结构,树里面包含了组合以及个别的对象。
         b. 使用组合结构,我们能吧相同的操作应用在组合和个别对象上。换句话说,在大多数情况下,可以忽略对象组合和个别
            对象之间的差别。
         c. 所有的组件都必须实现接口,然而,叶节点和组合节点的角色不同,所以有些方法可能并不适合某种节点。面对这种情况,
            有时候,最好抛出运行时异常。
            
11. 状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

12. 代理模式:为另一个对象提供一个替身或占位符以控制对这个对象的访问。
         a. 客户对象所做的就像是在在远程方法调用,但其实只是调用本地堆中的“代理”对象上的方法,再由代理处理所有网络通信的
            底层细节。
         b. 使用代理模式创建代表对象,让代表对象控制某对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或
            需要安全控制的对象。
         c. 特殊化的装饰者模式。
        
13. 模式中的模式:MVC
         a. 模式通常被一起使用,并被组合在同一个设计解决方案中。
         b. 复合模式在一个解决方案中结合两个或多个模式,以解决一般或重复发生的问题。

总结:
    a. 模式是在某情境下,针对某问题的某种解决方案。
    b. 创建型设计模式:涉及到将对象实例化,这类模式都提供一个方法,将客户从所需要实例化的对象中解耦。
         * Singleton、Abstract Factory、Factory Method、Prototype、Builder
    c. 行为型设计模式: 涉及到类和对象如何交互及分配职责。
         * Template Method、Iterator、Command、Observer、Observer、Strategy、Mediator、Visitor、Interpreter、Chain of Responsibility、
           Memonto
    d. 结构型设计模式:可以把类或对象组合到更大的结构中。
         * Decorator、Proxy、Composite、Facade、Bridge、Flyweight、Adapter
        
附注:第一次阅读完2011.07.20