设计模式作为一门艺术,我认为有三个特点:
1.行话:一听就知道是内行,节约双方沟通时间,通过一个观察者模式就知道整体实现。
2.抽象:能把思维提高到架构设计层面,不用细节到对象、类的具体实现这种琐碎的事上。
3.经验:设计模式作为OOP的最佳实践,是前人深思熟虑、经受时间考验的成果。
《Head First设计模式》书中所介绍的模式:
模式分类 | 常用的23种模式 | 一句话描述 | 应用场景 | 现实类比 |
---|---|---|---|---|
创建型 | 单例模式(Singleton) | 确保一个类只有一个实例,并提供一个全局访问点。 | 线程池、对话框 | 多人共享一台打印机 |
构建模式(Builder)(生成器模式) | 封装复杂对象,可动态创建和改变,隐藏内部实现。 | 可组合对象封装 | KFC不同的套餐 | |
原型模式(Prototype) | 提供基类创建对象种类,通过拷贝新种类创建新的对象。 | clone()方法 | 细胞分裂、以太猫 | |
抽象工厂模式(Abstract Factory) | 使用组合,创建对象的家族,而无需指定他们的具体类。 | 生成不同操作系统的程序 | QQ换肤、政府管理公司(工厂) | |
工厂方法模式(Factory Method) | 使用继承,由子类决定要创建的具体类是哪一个。 | 写日志到不同的地方 | 公司(工厂)生产的具体商品 | |
行为型 | 策略模式(Strategy) | 封装了可以互换替换的方法,方法间的变化互不影响。 | 公共方法、公共类 | 泡面中的调料包 |
状态模式(State) | 封装了基于状态的行为,并使用委托在行为之间切换。 | 登录状态 | 电梯中开闭门,启动停止状态的排列组合 | |
责任链模式(Chain of Responsibility) | 对象链可以依序检查请求并进行处理。 | DNS寻址过程 | 领导向上追责 | |
解释器模式(Interpreter) | 按“语句”规则动态生成类,类方法用于解释“语句”的行为。 | SQL解析、符号处理、编译器原理 | english | |
命令模式(Command) | 封装请求成为对象。 | GUI按钮 | 按菜单点餐 | |
观察者模式(Observer) | 让对象能够在状态改变时被通知。 | 发布/订阅、消息队列 | 降价商品的短信通知 | |
备忘录模式(Memento) | 把重要状态封装在外面,实现数据恢复能力。 | 数据库事务 | 后悔药、游戏存档 | |
迭代器模式(Iterator) | 在对象集合里按序访问,又不暴露集合内部的具体实现。 | iterator、foreach | 想着晚上去哪个餐厅的时候 | |
模板方法模式(Template Method) | 由子类决定如何实现一个方法中的步骤。 | 框架开发、二次开发 | 房屋骨架的基建 | |
访问者模式(Visitor) | 提供访问中介类,隐藏客户直接访问组合类的具体方法。 | 拦截器、过滤器 | 保险代理人定制险种 | |
中介者模式(Mediator) | 控制逻辑集中,协调多个独立的类之间传递消息。 | MVC的C | 房产中介,协调买家和卖家 | |
结构型 | 装饰者模式(Decorator) | 动态地将责任附加到对象上,有别于继承的另一种选择。 | 链式调用 | 斜杠青年、俄罗斯套娃 |
代理模式(Proxy) | 包装对象,以控制对此对象的访问。 | 快捷方式、VPN | 车票代售 | |
组合模式(Composite) | 统一方法处理对象,子类无法影响父类。 | 文件目录管理 | 公司部门分层 | |
桥连接模式(Bridge) | 抽象和实现可以独立扩展,不会影响到对方。 | JDBC的API | 港珠澳大桥 | |
适配器模式(Adapter) | 提供接口,让原来不兼容的类之间可以合作无间。 | 软件驱动、Wine | 电源转换插头 | |
蝇量模式(Flyweight)(享元模式) | 管理许多“虚拟对象”,减少实例化个数和节省内存。 | 数据池 | 土豪开车,如果没有宝马就new一个 | |
外观模式(Facade) | 提供统一接口,简化一个系统中的一群接口。 | 第三方API、SDK调用 | 公司前台接待 |
参考资料:
https://refactoringguru.cn/design-patterns/
https://www.runoob.com/design-pattern/visitor-pattern.html