简单理解设计模式

前言

对接口编程而不是对实现编程。
优先使用对象组合而不是继承。

1、创建型模式

工厂模式(Factory Pattern)

通过工厂类创建产品类的实例。
简单工厂模式
只有一个工厂类,由这一个工厂类根据用户输入的条件来决定创建出哪一个产品类的实例。用户使用这一个工厂类并输入判断条件来创建相应的产品类实例。

工厂方法模式
有一个抽象工厂类(或接口),多个具体工厂类继承(或实现)抽象工厂类。每个具体工厂类只能创建一个具体产品类的实例。由用户决定使用哪个具体工厂类来创建对应的产品类实例。

抽象工厂模式
对工厂方法模式进行了扩展,区别是:工厂方法模式中每个具体工厂类,只能创建一个产品族的产品类实例。抽象工厂模式支持创建多个产品族的产品类实例。

单例模式(Singleton Pattern)

调用类的getInstance()方法获取唯一的静态实例。

建造者模式(Builder Pattern)

使用创建者类来构造其他类的实例。

原型模式(Prototype Pattern)

用于创建重复的对象,同时又能保证性能。一个类实现Cloneable接口,先缓存该类的一个对象,然后通过调用该对象的clone()方法创建另一个对象。

适配器模式(Adapter Pattern)

类A要想获得类B的功能,首先由适配器类C关联并适配了B的功能,A关联适配器类C,最终获得了B的功能。

2、结构型模式

桥接模式(Bridge Pattern)

实现系统可能有多个角度分类,每一种角度都可能变化,那么把这种多角度分类给分离出来让他们独立变化。抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,减少他们之间耦合。
例如:一个画图的系统,需要画的形状有:圆形,正方形,长方形,需要画的颜色有:红、黄、绿。如果采用类的继承,画图基类下面可以派生出9种子类(红圆形、黄圆形、绿圆形、红正方形、黄正方形、绿正方形、红长方形、黄长方形、绿长方形)。如果采用桥接模式,分离出形状和颜色两个基类,他们之间使用关联关系,每个基类下只派生出3个子类。

过滤器模式(Filter Pattern)

又叫标准模式(Criteria Pattern),使用不同的标准类来过滤被处理类的一组对象,通过逻辑运算以解耦的方式把它们连接起来,而不是把过滤的逻辑运算写在被处理类中。

组合模式(Composite Pattern)

就是一个类含有自己对象组的成员。依据树形结构来组合对象,用来表示部分以及整体层次。
例如:

public class Employee {
    private String name;
    private String dept;
    private int salary;
    private List<Employee> subordinates;
...
}

装饰器模式(Decorator Pattern)

创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
例如:有一个Shape接口,以及其实现类Circle、Rectangle,为了扩展Shape的功能,另外再创建一个实现Shape接口的装饰类ShapeDecorator,并把Shape对象作为它的实例变量,装饰类ShapeDecorator就可以在Shape的功能基础上再扩展新的功能,同时又不改变Shape的功能。

外观模式(Facade Pattern)

定义一个外观类,外观类隐藏系统的复杂性,为客户端提供简化的方法和对现有系统类方法的委托调用。
例如:二手房交易的中介,属于外观模式。买房者通过中介可以简单地买到二手房,中介自己把联系房东看房砍价、过户、交税这些复杂的事情都搞定了。

享元模式(Flyweight Pattern)

尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。主要用于减少创建对象的数量,以减少内存占用和提高性能。
例如:定义一个Shape接口和实现了Shape接口的实体类Circle。然后定义工厂类ShapeFactory。ShapeFactory有一个Circle的HashMap,其中键名为Circle对象的颜色。无论何时接收到请求,都会创建一个特定颜色的圆。ShapeFactory检查它的HashMap中的Circle对象,如果找到Circle对象,则返回该对象,否则将创建一个存储在 Hashmap 中以备后续使用的新对象,并把该对象返回到客户端。

代理模式(Proxy Pattern)

用一个代理类代表另一个类的功能,但是不改变被代理类的功能。目的是控制对被代理类的访问。

3、行为型模式

责任链模式(Chain of Responsibility Pattern)

为避免请求发送者与接收者耦合在一起,让多个对象都有可能接收处理请求,将这些对象连接成一条链(通常每个接收者都包含对另一个接收者的引用),并且沿着这条链传递请求,直到有对象处理它为止。
例如:定义抽象类 AbstractLogger。然后派生了三个子类 InfoLogger、DebugLogger、ErrorLogger,并让这3个对象通过引用连成一条链。请求者将请求发给链首,每个日志记录器判断日志的级别是否属于自己的级别,如果是就记录下来,否则就把日志传给下一个日志记录器。

命令模式(Command Pattern)

在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。为了解除行为请求者与行为实现者的紧耦合的关系,将一组行为抽象为命令类,不同的行为组可以抽象出不同的命令类。请求者选择执行哪个命令,在具体命令类中调用行为实现者的行为。

解释器模式(Interpreter Pattern)

对于一些固定文法构建一个解释句子的解释器。这种模式实现了一个表达式接口,该接口解释一个特定的句子。这种模式被用在 SQL 解析、符号处理引擎等。

迭代器模式(Iterator Pattern)

迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。

中介者模式(Mediator Pattern)

用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。将各对象之间的网状结构分离为星型结构。
例如:MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

备忘录模式(Memento Pattern)

所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
例如:打游戏时的存档。

观察者模式(Observer Pattern)

在目标对象中有一个集合存放着所有观察者们的引用。当目标对象的状态发生改变,目标对象依次调用观察者的方法,让所有的观察者对象都得到通知。

状态模式(State Pattern)

在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象,context对象关联状态对象。外界改变状态对象时,context 对象的行为也相应发生了变化。

空对象模式(Null Object Pattern)

在空对象模式中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。

public class NullCustomer extends AbstractCustomer {
    @Override
    public String getName() {
        return "Not Available in Customer Database";
    }

    @Override
    public boolean isNil() {
        return true;
    }
}

策略模式(Strategy Pattern)

一个类的行为或其算法可以在运行时更改,将其不同行为或算法抽象成不同的策略类,该类关联策略类。
例如:定义一个 Strategy 接口和实现了 Strategy 接口的实体策略类:OperationAdd、OperationSubstract、OperationMultiply。Context 是一个使用了该策略的类。

public class Context {
    private Strategy strategy;

    public Context(Strategy strategy){
        this.strategy = strategy;
    }

    public int executeStrategy(int num1, int num2){
        return strategy.doOperation(num1, num2);
    }
}

模板模式(Template Pattern)

对于一个操作中的算法骨架,在抽象类中公开定义了执行它的模板方法,这个模板方法以final修饰,不允许子类重写。模板方法调用的其他抽象方法可以被子类重写。

访问者模式(Visitor Pattern)

主要用于将数据结构与数据操作分离,解决稳定的数据结构和易变的操作耦合问题。访问者类中引用元素类,访问者类对外提供易变的元素操作方法。

4、J2EE模式

MVC模式(Model View Controller Pattern)

用于应用程序的分层开发。
Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
View(视图) - 视图代表模型包含的数据的可视化。
Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。

业务代表模式(Business Delegate Pattern)

用于对表示层和业务层解耦。
客户端(Client) - 表示层代码可以是 JSP、servlet 或 UI java 代码。
业务代表(Business Delegate) - 一个为客户端实体提供的入口类,它提供了对业务服务方法的访问。
查询服务(LookUp Service) - 查找服务对象负责获取相关的业务实现,并提供业务对象对业务代表对象的访问。
业务服务(Business Service) - 业务服务接口。实现了该业务服务的实体类,提供了实际的业务实现逻辑。
例如:BusinessDelegate类通过成员变量关联了BusinessLookUp、BusinessService类。在doTask()方法中,首先通过调用BusinessLookUp的getBusinessService()方法获取BusinessService对象引用,然后调用BusinessService的处理方法doProcessing()。Client类通过成员关联了BusinessDelegate类,Client类的doTask()方法调用BusinessDelegate类的doTask()方法。

组合实体模式(Composite Entity Pattern)

用在 EJB 持久化机制中。一个组合实体是一个 EJB 实体 bean,代表了对象的图解。当更新一个组合实体时,内部依赖对象 beans 会自动更新,因为它们是由 EJB 实体 bean 管理的。以下是组合实体 bean 的参与者。
组合实体(Composite Entity) - 它是主要的实体 bean。它可以是粗粒的,或者可以包含一个粗粒度对象,用于持续生命周期。
粗粒度对象(Coarse-Grained Object) - 该对象包含依赖对象。它有自己的生命周期,也能管理依赖对象的生命周期。
依赖对象(Dependent Object) - 依赖对象是一个持续生命周期依赖于粗粒度对象的对象。
策略(Strategies) - 策略表示如何实现组合实体。
例如:一个组合实体包含一个粗粒度对象,一个粗粒度对象包含2个依赖对象。

数据访问对象模式(Data Access Object Pattern)

用于把低级的数据访问 API 或操作从高级的业务服务中分离出来。以下是数据访问对象模式的参与者。
数据访问对象接口(Data Access Object Interface) - 该接口定义了在一个模型对象上要执行的标准操作。
数据访问对象实体类(Data Access Object concrete class) - 该类实现了上述的接口。该类负责从数据源获取数据,数据源可以是数据库,也可以是 xml,或者是其他的存储机制。
模型对象/数值对象(Model Object/Value Object) - 该对象是简单的 POJO,包含了 get/set 方法来存储通过使用 DAO 类检索到的数据。

前端控制器模式(Front Controller Pattern)
是用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理。该处理程序可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体。
前端控制器(Front Controller) - 处理应用程序所有类型请求的单个处理程序,应用程序可以是基于 web 的应用程序,也可以是基于桌面的应用程序。
调度器(Dispatcher) - 前端控制器可能使用一个调度器对象来调度请求到相应的具体处理程序。

拦截过滤器模式(Intercepting Filter Pattern)

用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体。
过滤器(Filter) - 过滤器在请求处理程序执行请求之前或之后,执行某些任务。
过滤器链(Filter Chain) - 过滤器链带有多个过滤器,并在 Target 上按照定义的顺序执行这些过滤器。
Target - Target 对象是请求处理程序。
过滤管理器(Filter Manager) - 过滤管理器管理过滤器和过滤器链。
客户端(Client) - Client 是向 Target 对象发送请求的对象。
例如:Client将请求发送给FilterManager,FilterManager把请求传递给FilterChain,FilterChain先使用每个Filter对请求进行过滤,然后再调用Target的方法处理请求。

服务定位器模式(Service Locator Pattern)

用在我们想使用 JNDI 查询定位各种服务的时候。考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术。在首次请求某个服务时,服务定位器在 JNDI 中查找服务,并缓存该服务对象。当再次请求相同的服务时,服务定位器会在它的缓存中查找,这样可以在很大程度上提高应用程序的性能。以下是这种设计模式的实体。
服务(Service) - 实际处理请求的服务。对这种服务的引用可以在 JNDI 服务器中查找到。
Context / 初始的 Context - JNDI Context 带有对要查找的服务的引用。
服务定位器(Service Locator) - 服务定位器是通过 JNDI 查找和缓存服务来获取服务的单点接触。
缓存(Cache) - 缓存存储服务的引用,以便复用它们。
客户端(Client) - Client 是通过 ServiceLocator 调用服务的对象。
例如:Client调用ServiceLocator方法获取服务,ServiceLocator从成员CaChe中查找已有的服务,如果有就直接返回,如果没有就在InitialContext中查找后返回并缓存到Cache中。

传输对象模式(Transfer Object Pattern)

用于从客户端向服务器一次性传递带有多个属性的数据。传输对象也被称为数值对象。传输对象是一个具有 getter/setter 方法的简单的 POJO 类,它是可序列化的,所以它可以通过网络传输。以下是这种设计模式的实体。
业务对象(Business Object) - 为传输对象填充数据的业务服务。
传输对象(Transfer Object) - 简单的 POJO,只有设置/获取属性的方法。
客户端(Client) - 客户端可以发送请求或者发送传输对象到业务对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值