# 简介


## ***设计模式***

### ***设计模式***

1. ***什么是设计模式***
   - *每一个模式描述了一个在我们周围不断重复发生的问题以及该问题的解决方案的核心，这样你就能一次又一次的使用该方案而不必重复劳动*
   - *设计模式有可以说是 可复用面向对象软件的基础*
   - ***重点在于 可复用 面向对象***

### ***如何解决复杂性***

1. ***分解***
   - *分而治之，将大问题分成多个小问题，将复杂问题分成多个简单问题*
   - *这个在算法是一个最重要的核心思路，但是在设计模式，只能说可以用，但是不够用!!!*
2. ***抽象***
   - *由于不能掌握全部的复杂对象，我们选择忽视他的非本质问题，而去处理泛化和理想化的对象模型*
   - *这个就是设计模式的核心思路*

## ***面向对象***

### ***面向对象设计***

1. ***变化是复用的天敌，而面向对象设计就是抵御变化！！！***

### ***重新认识面向对象***

1. ***理解隔离变化***
   - *从宏观层面来看，面向对象的构建方式更能适应软件变化，能将变化所带来的影响度减为最小*
   - *从微观层面来看，面向对象的方式更强调每个类的责任，由于需求变化导致的新增类型不应该影响原来类型的实现*
2. ***对象是什么***
   - *从语言实现层面来看，对象封装了代码和数据*
   - *从规格层面讲，对象是一系列可被使用的公共接口*
   - *从概念层面讲，对象是某种拥有责任的抽象*

### ***面向对象设计原则***

1. ***依赖倒置原则***
   - *高层模块（稳定）不应该依赖于底层模块（变化），二者应该依赖于抽象（稳定）*
   - *抽象（稳定）不应该依赖于实现细节（变化），实现细节应该依赖于抽象*
2. ***开放封闭原则***
   - *对扩展开放，对更改封闭，类模块应该是可扩展的，并且不能修改*
3. ***单一职责原则***
   - *每个类引起他变化的原因只准一个，不能是多个*
4. ***要多用组合，而不是多用继承***
   - *继承会造成子类的数目和功能急剧膨胀，所以要多用组合*
5. ***封装变化***
   - *将变化点封装起来，不要去影响稳定点*
6. ***替换原则***
   - *子类应该去重写父类方法，而不是去隐藏父类方法*
7. ***接口隔离原则***
   - *接口应该小而完备，不应该强迫客户程序依赖他们不用的方法*
8. ***针对接口编程，而不是针对实现编程***
   - *不将变量类型声明为某个特定的具体类，而是抽象出来声明为某个接口*
   - *客户程序无需获知对象的具体类型，只需要知道对象所具有的接口*
   - *减少系统中各部分的依赖关系，从而实现 "高内聚， 松耦合" 的类型设计*

## 

