常用设计模式日记
参考资料:https://www.runoob.com/design-pattern/design-pattern-tutorial.html
设计模式原则
- 重要原则
高聚合低耦合 - 开闭原则
对扩展开放,对修改关闭 - 接口隔离原则
使用多个隔离的接口,比使用单个接口要好,降低类之间的耦合度
设计模式类型
设计模式通常分创建型模式 结构型模式 行为型模式。
- 创建型模式
1, 工厂模式
关键特征:创建过程在其子类执行。工厂根据不同的类型创建不同的子类对象。
2,抽象工厂模式
关键特征:在一个工厂里聚合多个同类产品。多个工厂模式的组合。,
3, 单例模式(Singleton)
单例类必须自己创建自己的唯一实例
懒汉式: 需要的时候才建自己的唯一实例
饿汉式: 类加载时就建自己的唯一实例,建议使用此法。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键特征:构造函数是私有的。对外getInstance是静态的。
4,原型模式(Prototype)
基于现有对象模板,通过克隆方式创建对象的模式
利用已有的一个原型对象,快速地生成和原型对象一样的实例
关键特征:大量创建相同或者相似的对象,并把它们存储在一个 Hashtable 中。 ,
5, 建造者模式(Builder)
使用多个简单的对象一步一步构建成一个复杂的对象,将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
关键特征:
创建一个Builder类专门负责创建具体对象
建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系 - 结构型模式
1, 适配器模式
意图:作为两个不兼容的接口之间的桥梁,主要是兼容接口。
关键特征:适配器继承或依赖已有的类,不改变已有的类,实现想要的目标接口 。
应用实例: Play: mp3 mp4 vlc,
2, 桥接模式
意图:将抽象部分与实现部分分离,使它们都可以独立的变化。
关键特征: 分类分离接口,减少它们之间耦合
3, 外观模式:
在现有的系统添加一个接口,来隐藏系统的复杂性。创建一个外观类,在外观类内把相关的对象分类创建。并实现各自的调用方法。
关键特征:在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。
public class ShapeMaker {
private Shape circle;
private Shape rectangle;
private Shape square;
public ShapeMaker() {
circle = new Circle();
rectangle = new Rectangle();
square = new Square();
}
public void drawCircle(){
circle.draw();
}
public void drawRectangle(){
rectangle.draw();
}
public void drawSquare(){
square.draw();
}
}
4, 装饰模式:
装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
何时使用:在不想增加很多子类的情况下扩展类。
关键特征: 1、Component 类充当抽象角色,不应该具体实现。 2、修饰类引用和继承 Component 类,具体扩展类重写父类方法。
@Override
public void draw() {
decoratedShape.draw();
setRedBorder(decoratedShape);
}
- 行为型模式
1,观察者模式:当一个对象被修改时,则会自动通知依赖它的对象
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
关键特征:在抽象类里有一个 ArrayList 存放观察者们。
2, 责任链模式:
意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
何时使用:在处理消息的时候以过滤很多道。
如何解决:拦截的类都实现统一接口。
关键特征:抽象处理类
主要包含一个指向下一处理类的成员变量 nextHandler 和一个处理请求的方法 handRequest,handRequest 方法的主要思想是,如果满足处理的条件,则有本处理类来进行处理,否则向下传递由 nextHandler 来处理
3, 命令模式:
如何解决:通过调用者调用接受者执行命令,顺序:调用者→命令→接受者。
关键特征:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口
4, 迭代器模式:
意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
主要解决:不同的方式来遍历整个整合对象。
何时使用:遍历一个聚合对象。
如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。
关键特征:定义接口:hasNext, next。
5, 策略模式:
意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:将这些算法封装成一个一个的类,任意地替换。
关键特征:不同的算法实现同一个接口。