装饰模式
- 装饰模式是给一个已有的功能动态的添加更多的功能的一种方式
- 使用场景:
当需要向旧的类中添加新的代码,而新的代码只是用于装饰类原本的核心职责,这种情况下就可以使用装饰模式
例如:
当需要进行数据持久化操作时,需要先对数据进行过滤和加密,这个功能的核心职责就是数据持久化而过滤和加密属于装饰功能
- 模式优点:
将类的核心职责与类的装饰功能区分开,并且可以去除相关类的中的重复的装饰逻辑
代理模式
- 代理模式就是在就访问对象时增加一定的间接性,这种间接性可以有多种用途,由代理对象去执行真实对象的方法
- 使用场景
-
远程代理:为一个对象在不同的地址空间提供局部代表,这样可以隐藏真实对象存在于不同地址空间的事实
-
虚拟代理:当需要创建开销很大的对象时,由一个虚拟的对象先去代表真实的大开销对象,比如网页加载图片时,图片未加载出来之前是一个一个的方块,这些方块就是虚拟对象,虚拟对象中存着真实对象的图片路径和大小
-
安全代理:用来控制对真实对象的访问权限
-
智能引用:当访问真实对象时,代理还要处理一些额外的事。例如,创建完一个持久的对象后,将其装入内存中;或者在访问一个真实对象前,检查其是否已经被锁定
工厂方法模式
- 工厂方法模式定义一个用于工厂的接口,由子类工厂决定实例化哪一个类
- 和简单工厂模式比较:
- 当需要为简单工厂添加新的实例化类
- 工厂方法模式中如果要增加新的类,只需要再去创建新的子类工厂与返回的对象即可,符合开放-封闭原则
模版方法模式
-
模版方法是将类中不变的行为移到父类中,去除子类中的重复代码
例如:一份试题类中,每个人的试题题目都一样,不同的只有每个人填的答案以及名字,这样就可以使用模版方法模式将试题题目移到父类中
外观模式
- 为子系统中的一组接口提供一个一致的界面,即一个高层接口,这个接口使得这一子系统更加容易使用
- 使用场景:
- 在设计系统之初,就应该有意识的将不同的两个层分离,比如MVC三层架构,就应该考虑在表示层、业务逻辑层、数据访问层之间建立一个外观模式类 Facade来供使用,降低耦合性
- 在开发阶段,因为系统会因为不断的演化、重构变得复杂,此时就可以使用外观模式来降低各个功能间的依赖
- 在维护老系统时,可能因为老系统难以维护和扩展,此时就需要一个外观模式类Facade来对老系统进行交互,而新系统则与Facade交互
建造者模式
- 将一个复杂对象的构建和他的表示分离,使得同样的构建过程可以创建不同的表示
- 如何使用建造者模式:
首先我们需要一个抽象的建造者,建造者中定义好了构建过程,再由具体的建造者去实现构建过程,这样每次构建的过程都是相同的,而构建的细节不同,再由一个指挥者与客户端交互,客户端需要什么样的产品(表示),由指挥官完成建造。
建造者模式是在当创建复杂对象的逻辑时需要独立这个对象的组成部门和他们的装配方式时适用的模式
观察者(发布-订阅)模式
- 观察者模式定义了一种一对多的关系,让多个观察者来监听某一个对象,当这个对象的状态发生改变时,会通知所有的观察