设计模式、设计原则、反模式

来源:互联网 发布:php artisan数据库 编辑:程序博客网 时间:2024/05/29 16:58

什么是设计模式

模式是在某种情境下,针对某种问题的某种解决方案。
设计模式算是一种经验复用。

模式分类

1,创建型:涉及到将对象实例化。
如:单例模式,工厂模式
2,结构型:把类或对象组合到更大的结构中。
如:装饰器,代理模式,适配器模式
3,行为型:涉及到类和对象如何交互及分配职责。
模板方法,观察者模式,策略模式

设计原则

1,封装变化。找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起
2,针对接口编程,而不是针对实现编程。此处的接口是指超类型,针对接口编程的意思是利用多态的能力,使得实际的类型可以动态绑定到真正需要的实现上。
3,多用组合,少用继承。组合比继承更灵活。
4,为了交互对象之间的松耦合设计而努力。这样会使我们的系统更有弹性,在应对新的需求时,由于对象之间的相互依赖降低到最低,从而需要修改的量最小。
5,开闭原则:类应该对扩展开放,对修改关闭。意思是在不修改现有类的代码情况下,扩展类可以满足新的需求。因为已有代码是精心设计的,修改容易产生BUG,而且精心设计的代码,是易于扩展的。
6,依赖导致原则:要依赖抽象,不要依赖具体类。
7,最少知识原则:只和你的密友谈话。减少对象之间的交互。从而将受到影响而导致修改的可能性降到最低。
8,别调用我,我会调用你。这是组合高层组件和低层组件的一种原则。高层组件决定什么时候以及如何调用低层组件。低层组件只是挂在高层组件之下。
9,一个类应该只有一个引起变化的原则。

对于2,针对接口编程,一种理解方式是把这个编程理解为构建模型。也就是在构建模型时,要针对接口来构建,而不是针对具体实现来构建。这样模型的每个模块都是以约定的接口格式来交互,不用考虑具体的实现。这时候多态就可以充分发挥作用。并且很容易实现高内聚和低耦合。这个是侧重模型的模块间交互方面来看待针对接口编程。
还有一种理解,也许更正确。从模块自身方面,针对接口编程,就是针对超类型编程,这个超类型可以是父类,接口类等。针对接口编程的关键在于多态。多态使得程序不会绑死在超类的类型上。举例说明:
针对实现编程
Dog dog = new Dog();
d.bark();
针对接口编程
Animal animal = new Dog();
animal.bark();
甚至子类的实例化动作不需要在代码中硬编码,比如new Dog()可以在『运行时才指定具体实现的对象』。
a = getAnimal();
a.makeSound();

策略模式:定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
装饰器模式:动态的将责任附加到对象上,若要扩展功能,装饰器提供了比继承更有弹性的替代方案。
工厂模式:简单的工厂模式,就是把对象的创建提出来单独处理。而标准的工厂模式,定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确确定具体类。
单例模式:确保一个类只有一个实例,并提供一个全局访问点。
命令模式:将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其它对象。命令模式也支持可撤销的操作。
适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。
组合模式:允许你将对象组合成树形结构来表现『整体/部分』层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
代理模式:为另一个对象提供一个替身或占位符以访问这个对象。

反模式

意思为应用不当设计模式会带来很大的麻烦。
而且反模式是那是看上去应用了一个好的模式作为解决方案,但是实际使用中会导致比较严重的问题。
反模式时刻提醒我们,不要过度模式化,也不用严格遵守特定模式的规则,在实际使用时根据需求而做出调整。

原创粉丝点击