23种设计模式的设计原则为:
1、开闭原则
2、单一职责原则
3、依赖倒置原则
4、里氏替换原则
5、迪米特原则(最小知道原则)
6、组合复用原则
23种设计模式可分为三种大的类型
一、创建型
1、工厂模式(Factory):
分为简单工厂模式和工厂方法模式。
简单工厂模式也称为静态工厂模式,一般是用类的静态方法实现的,涉及角色有简单工厂,抽象产品,具体产品。个人的简单理解:向静态方法传不同的标识,在方法中根据标识的不同构建不同的对象,然后返回构建的对象。
工厂方法模式涉及角色:抽象工厂、具体工厂、抽象产品、具体产品。个人的简单理解:一个工厂只能生产一种产品。具体工厂来生成具体的产品, 每多一个产品就要有一个对应的工厂,工厂与产品一一对应。
2、抽象工厂模式(AbstractFactory):
抽象工厂模式涉及角色:抽象工厂、具体工厂、抽象产品、具体产品。个人的简单理解:一个工厂可以生产多种产品。比如说冰箱、电视、洗衣机,海尔可以生产,海信可以生产,美的也可以生产,但是每家工厂生产出来的冰箱、电视、洗衣机外型功能可以各不相同。
3、建造者模式(Bulider):
建造者模式将复杂对象的构建与它的表示分离,涉及角色为:产品、抽象建造者、具体建造者、指挥者。个人的简单理解:比如要生产一辆自行车,只需要告诉指挥者需要哪种类型的自行车,指挥者就会调用哪种类型的建造者来生产自行车,具体的生产过程不需要知晓和参与。
4、单例模式(Singleton):
单例模式涉及角色:单例类、访问类。个人的简单理解:一个类只能产生唯一的一个实例对象。
5、原型模式(Prototype):
原型模式涉及角色:抽象原型类、具体原型类、访问类。个人的简单理解:通过克隆来实现对象的复制。
二、结构型
1、代理模式(Proxy):
代理模式可分为静态代理模式和动态代理模式,涉及角色:抽象主题、真实主题、代理类。
静态代理模式可以理解代理类在编译是生成,即需要编码代理类。
动态代理模式可以理解为调用了反射功能来实现代理功能,如JAVA中的Proxy中的newProxyInstance方法。
个人的简单理解:可以将真实主题想像为明星,代理想象成明星的经纪人,在明星参加商业活动前的合约谈判和活动后的善后工作都是有经纪人来完成的,在活动中需要明星亲自参与,如AOP实现了代理。
2、适配器模式(Adapter):
适配器模式是将一个接口转化为另一个接口,涉及角色:目标接口、适配者类、适配器类。个人的简单理解:可以想像成 USB 与 Type-C 的转换器。
3、桥接模式(Bridge):
桥接模式将抽象与实现分离,使它们可以独立变化,涉及角色:抽象化角色、扩展抽象化角色、实现化角色、具体实现化角色。个人的简单理解:可以想像成表格,有X、Y两个不同的维度,一个单元格要同时有X、Y两个坐标,但两个坐标不是并列关系(X,Y),是主副关系 X(Y)。
4、装饰模式(Decorator):
装饰模式是在不改变现在对象结构的情况下,动态增加对象的职责,涉及的角色:抽象构件角色、具体构件角色、抽象装饰角色、具体装饰角色。个人的简单理解:可以看成游戏中的人物,给人物加连续不同的装备可以实现不同的技能。
5、外观模式(Facade):
外观模式涉及角色:外观角色、子系统角色、客户角色。个人的简单理解:实现了客户对一个接口的调用,完成了对多个个子系统接口的统一调用。
6、享元模式(Flyweight):
享元模式对象的信息分为两个部分:内部状态和外部状态(内部状态指对象共享出来的信息,存储在享元信息内部,并且不回随环境的改变而改变;外部状态指对象得以依赖的一个标记,随环境的改变而改变,不可共享),涉及角色:抽象享元角色、具体享元角色、非享元角色、享元工厂角色。个人的简单理解:可以把该模式想成池应用,如共享池、数据库连接池等。
7、组合模式(Composite):
组合模式也称为整体部分模式,是一种树状的层次模式,涉及角色:抽象构件角色、树叶构件角色、树枝构件角色。个人的简单理解:可以理解windows管理器中的树状目录结构。
三、行为型
1、模板方法模式(TemplateMethod):
模板方法模式定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以实现特定的处理,涉及角色:抽象类/抽象模板、具体子类/具体实现。个人的简单理解:可以想像一下银行的取号、业务办理、评价功能,取号和评价功能可以是统一一致的处理,但是业务办理需要根据具体的业务来处理。
2、策略模式(Strategy):
策略模式定义了一系统算法,并将算法封装起来,算法可以相互替换,算法的变化不会影响使用算法的客户,涉及的角色为:抽象策略类、具体策略类、环境类。个人的简单理解:将简化if..else if... 或 switch... case ...的实现,需要哪种策略算法,就把哪种策略算法给到环境类。
3、命令模式(Command):
命令模式涉及角色:抽象命令类、具体命令类、实现者/接收者、调用者/请求者。个人的简单理解:可以将命令想像为餐馆的点菜单,服务员是调用者,厨师是接收者,服务员将客户的点菜单交给厨师,厨师根据菜单来做菜。
4、责任链模式(ChainOfResponsibility):
责任链模式将所有请求按照给定的顺序传递处理,涉及角色:抽象处理者、具体处理者、客户类。个人的简单理解:可以想像成请求中的过滤器/拦截器,或者 公司流程中的报销单流程。
5、状态模式(State):
状态模式把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为,涉及角色:环境类、抽象状态、具体状态。个人的简单理解:将状态作了封装,在状态类中实现对状态的转化和处理,可以想像成进程的3态或5态转换。
6、观察者模式(Observer):
观察者模式又称发布订阅模式,主要是一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新,涉及角色:抽象主题、具体主题、抽象观察者、具体观察者。个人的简单理解:可以想像一下博客中的订阅功能。
7、中介者模式(Mediator):
中介者模式也叫调停模式,用来将网状的结构转为星形结构,降低耦合性,涉及角色:抽象中介者、具体中介者、抽象同事类、具体同事类。个人的简单理解:可以想像一下房屋中介的功能,中介即要面对多位卖家,也要面对多家卖家。
8、访问者模式(Visitor):
访问者模式主要对集合中的不同类型数据进行多种操作,涉及角色:抽象访问者、具体访问者、抽象元素、具体元素、对象结构。个人的简单理解:根据关注点的不同,实现不同的处理,如对一个程序员,ceo和cto对程序员的考核不一样:ceo关注KPI,cto关注功能和代码质量。
9、迭代器模式(Iterator):
迭代器模式提供一个对象来顺序访问聚合对象中的一系列数据,涉及角色:抽象聚合、具体聚合、抽象迭代器、具体迭代器。个人的简单理解:可以想像一下java集合类的遍历。
10、备忘录模式(Memento):
备忘录模式主要保存对象的状态,以便将对象回复到原先的保存状态,涉及角色:发起人、备忘录、管理者。个人的简单理解:可以想像一下word中的ctrl+z功能。
11、解释器模式(Interpreter):
解释器模式实现对一些特定文法的解析,涉及角色:抽象表达式、终结符表达式、非终结符表达式、环境、客户端。个人的简单理解:可以想象一下编译原理的实现。