六大设计原则
1.单一职责原则:对于一个类,应该只有一个引起它变化的原因。
2.李氏代换原则:之类型能够替换掉它们的父类型。
3.开放-封闭原则:程序的实体对象(模块、类、函数等)应该可以进行扩展,但不应该进行修改。
对扩展开放
对修改封闭
4.依赖倒转原则:程序的高层模块不应该依赖于低层模块,但两者都依赖于抽象;抽象不应该依赖于具体细节,而细节应该依赖于抽象。
5.合成/聚合复用原则:尽量不使用类继承,而尽量使用合成/聚合。
6.迪米特法则:如果两个类之间不必直接通信,则这两个类不应该发生直接的相互作用。如果其中一个类需要调用另一个类的某个方法,可以通过第三方来转发这个调用。
创建型模式
简单工厂模式
工厂方法模式
抽象工厂模式
单例模式:保证一个类仅有一个实例,,并提供一个访问它的全局访问点。
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 。
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式最本质的特点就是:在不重新进行初始化对象的情况下动态获取对象运行时的状态。
浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有有的对其他对象的引用都依然指向原来的对象。
深复制:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
结构型模式
桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变换。
适配器模式:将一个类得接口转换成客户希望的另外一个接口。
装饰模式:动态地给一个对象添加一些额外的职责(就增加功能来说,装饰模式比生成子类更为灵活)。
组合模式:将对象组合成树行结构以表示“部分-整体”的层次结构(组合模式使得用户对单个对象和组合对象的使用具有一致性)。
享元模式:运用共享技术有效地支持大量细粒度的对象。
外观模式:为子系统中的一组接口提供一个一致的界面(此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用)。
代理模式:为其他提供一种代理以控制对这个对象的访问。
代理一般是在不改变原有服务实现代码的基础上添加一些额外操作的一种快速解决方案。代理在J2SE中分为动态代理和静态代理。
静态代理就是使用“代理模式”来实现的解决方法。生成一个和类相同接口的代理类,用户通过使用个代理类来封装,某个实现类。其目的是加强实现类的某个方法的功能,而不必原因的源代码。
JDK中的动态代理则是动态生成代理对象。
行为模式
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
策略模式:定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式算法的变化不会影响到使用算法的客户。
状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生改变时,会通知所有观察者对象,使它们能够自动更新自己。
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
中介者模式:用一个中介对象来封装一系列的对象交互,中介者使各个对象不需要显示地互相引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
命令模式:将一个请求封装成一个对象,从而使用户可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,并支持可撤销的操作。
访问者模式:表示一个作用于某对象结构中的各个元素的操作,它使你可以在不改变各元素的前提下定义作用于这些元素的新操作。
职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。
迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。