面向对象的23种设计模式

设计原则:高内聚低耦合,开闭原则。

两大基础设计原则

在说面向对象设计的六大原则之前,我们先来说下程序设计的原则:模块内高内聚,模块间低耦合。我们在面向对象时只需把类看成模块,那么就容易理解封装等了。

说是七大原则,这里我先提出来一个:对扩展开放,对修改关闭。 为啥这么说,因为我们都知道软件是要改的。对扩展开放保证了可以增加功能,像泛型啦这些。对修改关闭保证了像前的兼容性,jdk7兼容jdk6这样。所以开闭原则围绕软件的整个生命周期。

从基础原则出发,产生六个具体的原则:

1.单一职责(一个方法或一个类只做一件事,为了模块内高内聚)
2.迪米特法则(也叫最少知道原则,为了模块间低耦合)
3.里氏替换(就是继承原则,子类可以无缝替代父类。很好的符合了开闭原则)
4.依赖倒置(类之间的依赖通过接口实现,低耦合的同时对扩展开放)
5.接口隔离(即把单个复杂接口拆分为多个独立接口,与上条共同实现面向接口编程)
6.合成复用原则(即尽量使用合成/聚合的方式,而不是使用继承。主要为了防止继承滥用而导致的类之间耦合严重。记住只有符合继承原则时才用继承)

设计模式

我觉得程序员最好的沟通方式是代码,所以每个设计模式都是一个例子。所有例子都很方便,可以复制直接运行。因为对java熟悉,所以下面设计模式例子都是用java语言来实现的。

创建型模式(IOC:控制反转,就是创建分离的集大成)

1.Singleton:单例模式(全局只要一个实例)
2.Prototype:原型模式(通过拷贝原对象创建新对象)
3.Factory Method:工厂方法模式(对象创建可控,隐藏具体类名等实现解耦)
4.Abstract Factory:抽象工厂模式(解决对象与其属性匹配的工厂模式)
5.Builder:建造者模式(封装降低耦合,生成的对象与构造顺序无关)
创建型模式的五种有各自的使用环境,单例和原型比较简单就不说了,工厂方法模式和建造者模式,都是封装和降低耦合有啥不同呢,其实工厂方法关注的是一个类有多个子类的对象创建(汽车类的各种品牌),而建造者模式关注的是属性较多的对象创建(能达到过程无关)。而抽象工厂模式关注的是对象和属性及属性与属性的匹配关系(如奥迪汽车与其发动机及空调的匹配)。

结构型模式(对象的组成以及对象之间的依赖关系)

1.Adapter:适配器模式(适配不同接口和类,一般解决历史遗留问题)
2.Decorator:装饰器模式(比继承更灵活,可用排列组合形成多种扩展类)
3.Proxy:代理模式(可以给类的每个方法增加逻辑,如身份验证)
4.Facade:外观模式(对模块或产品的封装,降低耦合)
5.Bridge:桥接模式(就是接口模式,抽象与实现分离)
6.Plyweight:享元模式(相同对象的重用)
7.Composite:组合模式(整体和部分相同时,如文件夹包含文件夹)
我们可以看到适配器模式、装饰器模式、代理模式都可以用包装对象来实现(把对象作为一个属性放在用的对象里),所以模式关注的并不是实现,而是解决的问题。模式更多体现的是类与类之间的逻辑关系,比如代理模式和装饰器模式很像。但从字面就知道,代理是访问不了实际工作对象的,这是他们的区别。

行为型模式(即方法及其调用关系)

1.Strategy:策略模式(提供功能不同实现方式,且实现可选)
2.Template Method:模板方法模式(相同流程用一个模板方法)
3.Observer:观察者模式(用订阅-发布实现的被观察者变化时回调)
4.Iterator:迭代器模式(一种内部实现无关的集合遍历模式)
5.Chain of Responsibility:责任链模式(事件处理的分层结构产生的责任链条)
6.Command:命令模式(将命令者与被命令者分离)
7.Memento:备忘录模式(需要撤销与恢复操作时使用)
8.State:状态模式 (当对象两种状态差别很大时使用)
9.Visitor:访问者模式 (当对同一对象有多种不同操作时使用)
10.Mediator:中介者模式(以中介为中心,将网状关系变成星型关系)
11.Interpreter:解释器模式(常用于纯文本的表达式执行)

写完设计模式之后感觉设计模式更多的一种逻辑关系,如果代码中有这种逻辑关系就可以用了。记得需要时候再用,不能为了设计模式而设计模式。没有什么就是好的,最主要用起来舒服吧。

你可能感兴趣的:(java,设计模式详解)