此模式定义了用于创建对象的接口,但允许子类决定实例化哪个类。 它允许类将实例化延迟到子类。
一个实例化时需要做点初始化工作, 这些工作可能与此类无关,而与业务有关.所以实现代码不要再类种, 而且同时有多个类似的类.
这个时候就用一个工厂类, 将创建实例与使用实例分开. (具体事情做得越多,越容易犯错误)
由于实例化延迟到了子类, 所以改动会修改客户端的实例化代码. 这个时候利用反射 解决分支判断.
此模式定义了一系列算法,将每个算法封装起来并使它们可互换。 它允许算法独立于使用它的客户端。
定义一系列算法的方法, 所有这些算法完成相同的工作, 但是实现不同, 它们可以以相同的方式调用所有算法, 减少各种算法类与使用算法类之间耦合
此模式将附加职责附加到对象,动态地为子类化提供灵活的替代,以扩展功能。
动态的给一个对象添加一些二外的职责, 就增加功能来说, 装饰模式比生成子类更灵活.
此模式为另一个对象提供代理或占位符以控制对它的访问。
此模式指定使用原型实例创建的对象类型,并通过复制此原型来创建新对象。
此模式定义操作中算法的框架,将一些步骤推迟到子类。 它允许子类重新定义算法的某些步骤而不改变算法的结构。
当我们要完成某以细节层次一致的过程或步骤, 但是=个别步骤再更详细的层次上实现可能不同时, 通常考虑模板方法模式来处理
此模式为子系统中的一组接口提供统一接口。 它定义了一个更高级别的接口,使子系统更易于使用。
此模式将复杂对象的构造与其表示分开,以便相同的构造过程可以创建不同的表示。
主要用于创建一些复杂的对象, 这些对象内部构建间的顺序通常是稳定的, 但对象内部的构建通常面临复杂的变化.
比如收银台的结算过程: 统计订单结算金额 -> 统计订单积分 -> 增加商品销售记录 -> 扣除会员余额,增加会员积分. 这个过程是稳定的, 但是统计积分的实现等都可能变化
此模式定义对象之间的一对多依赖关系,以便当一个对象更改状态时,将自动通知和更新其所有依赖项。
提供一个创建一系列相关或相互依赖对象的接口, 而无需指定它们具体的类
软件实体(类, 模块, 函数等)应该可以扩展, 但是不可修改.
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类。
软件实体如果使用的是一个父类, 那么一定适用于其字类, 而且它察觉不出父类对象和字类对象的区别. 也就是说, 再软件里面, 把父类都替换成它的子类, 程序的行为没有变化. (子类型必须能够替换掉他们的父类型)
LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用. 里氏代换原则是对“开放-封闭”原则的补充. 实现“开放-封闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范
A. 高层模块不应该依赖底层模块. 两个都应该依赖抽象.
B. 抽象不应该依赖细节. 细节应该依赖与抽象
比如: 开发时候为了复用, 把常用代码写成许多函数库, 项目要访问数据库时, 访问数据库的代码就写成函数, 这样高层就依赖了底层模块.
但是如果做新项目时, 发现业务逻辑的高层模块都是一样的, 但是客户希望使用不同的数据库或存储方式. 这时候就没法复用高层模块了, 应该它们依赖与底层模块. 就像CPU, 内存都依赖于主板, 主板坏不能所有部件都没用, 反过来内存坏了也不应该导致其他部件不能用. 所以都应该依赖抽象, 只要接口是稳定的, 那么就不用担心.
使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合
最少知道原则.一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立
如果两个类不必彼此直接通信, 那么这两个类就不应当发生直接的互相作用. 如果其中一个类需要调用另一个类的某一方法, 可以通过第三者转发这个调用
尽量使用合成/聚合的方式,而不是使用继承
大话设计模式
GOF23种设计模式精解
利用反射和策略模式解决大量switch case
原文:https://www.cnblogs.com/xueyoucd/p/9684896.html