设计模式感悟
学习经过
博主看了《head first 设计模式》和《大话设计模式》,这两本书只是简单讲明白了什么是设计模式,并没有特别经典的实战案例,为不小遗憾。对此我这两本书并不推荐,只是入门建议参考菜鸟教程设计模式,博主学习下面设计的模式的代码已提交basics_of_programming
为什么使用设计模式?
模式:是在某种情境(context)下,针对某问题的某种解决方案这个是老生常谈了 ,良好的设计模式可以帮助我们,更优雅和高效的编写代码,低耦合高内聚。比如面向接口编程,可以使得我们的代码拥有更佳的扩展性。 对修改关闭,对扩展开放的设计原则,不仅使用我们的代码优雅也更安全。各种设计模式都有各自优点,这里重点推荐下,动态代理和观察者模式,在很多框架中都实现了这些设计模式,一般面试也是就这两个吧!
后续学习计划
仅仅在这两本书学习到的设计模式知识非常有限,并没有太多实战价值,在现实中,很多需要用到设计模式的场景是十分复杂的,需要很高的编程技艺。这个只能通过阅读大佬们的源代码,看看别人为什么这么设计了,比如jdk和spring源码,有时间还是研读一番。jdk已经使用了很多设计模式,spring框架级源码也是非常有价值的。工作中能使用设计模式进行优化的,就尽量进行优化!
初步学习设计模式
- 面对对象Object Oriented=面向对象分析OOA+面向对象设计OOD+面向对象编程OOP
- 在面向对象的概念中,我们知道所有对象都是通过类来描述的,但反过来却不是,并不是所有类都是用来描述对象的,如果一个类没有包含足够的信息去描述对象,这样的类就是抽象类.
- ISP Interface Segregation Principle
继承是 is-a的关系,接口是like-a的关系,以继承来表明拥有什么样的本质,用接口来表明有什么样的功能
适配器模式
类适配器:就是不愿意修改现在的接口但又有其他的功能(已存在)要加上,那一般可以通过继承原来的类的,并且实现目标接口外观模式:外观模式定义了一个子系统的一组接口集成在一起的高层接口以提供一个一致的界面.通过这个界面,其他系统可以方便的调用子系统的功能,而
忽略子系统内部的变化.
注意事项:再设计外观模式时不需要增加额外的功能.不要从外观方法中直接返回子系统中的组件给客户.应用外观的目的是提供一个高层次的接口,不是底层细节处理.组合模式
组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。
组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。
简单来说就是把简单对象假想成符合对象(实际没有该功能),但是依旧提供一致的接口方法(共同实现统一的接口),分安全模式和透明模式,透明模式是所有对象行为一致,
但是不安全.桥接模式
是一种结构型设计模式。Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。
它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。
通过解耦把功能进行简化,然后共同组成一个功能,功能可以选择不同的参数.
比如一只蜡笔,是有颜色+毛笔,这样颜色的大小和毛笔的大小耦合在一起了,倘若有毛笔+颜料,这样颜料就不和笔的大小耦合在一起了,需要笔的数目也少了
通常我们用责任链模式
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。
这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
(找个时间实现一下)单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
(找个时间实现一下)中介模式
中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,
该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。代理模式
顺应开闭原则(对扩展开放,对修改关闭)
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。(Java动态代理实现原理,重点)享元模式
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。
由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象。(没怎么懂)建造者模式
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。简单工厂模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
Head First 设计模式
设计原则
总则:任何设计都要在抽象和速度之间取舍,在空间和时间之间平衡.
找出应用中可能需要变化之处,把它
们独立出来,不要和那些不 需要变化
的代码混在一起。针对接口编程,而不是针对实现编程
多用组合,少用继承
为了交互对象之间的松耦合设计而努力。
依赖倒置原则,要依赖抽象,不依赖具体类.
最少知识原则:不管任何对象,都需要注意和它交互的有哪些类,并注意是如何交互的.不要让太多类耦合在一起.
即在方法调用时,只在方法内调用一层而不推荐调用多层,即getId(){user.getID()}好莱坞原则:别调用我,我会调用你.底层组件可以挂钩在高层组件中,但是由高层组件决定调用时间以及是否调用,低级组件不得直接调用高层组件
单一责任原则:一个类应该只有一个引起变化的原因
设计模式
一、策略模式
定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户.
优点:
算法可以自由切换。
避免使用多重条件判断。
扩展性良好。
缺点:
1.策略类会增多。
2.所有策略类都需要对外暴露。
使用场景:
1.如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2.一个系统需要动态地在几种算法中选择一种。
3.如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
二、观察者模式
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖都会收到通知并且自动更新.JDK内置了观察者模式,具体为Observer接口和Observable类
三、装饰者模式
动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案.
java IO采用装饰者模式
四、工厂方法模式
定义了一个创建对象接口,但由子类决定实例化的类是哪一个.工厂方法类把实例化推迟到子类.
五、抽象工厂模式
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类.
六、单例模式
确保一个类只有一个实例,并提供一个全局访问点.
七、命令模式
将”请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象.命令模式也支持可撤销的操作.
八、适配器模式
将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间.
九、外观模式
提供一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.
十、模板方法模式
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤.
十一、迭代器模式
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示.
十二、组合模式
允许你将对象组合成树形来表现”整体/部分”层次解构.组合能让客户以一致的方式处理个别对象以及组合对象.
十三、状态模式
允许对象在内部状态改变时改变的它的行为,对象看起来好像修改了它的类。
十四、 代理模式
为另一个对象提供一个替身或者占位符以控制对这个对象的访问。
十五、 复合模式
复合模式结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题。
本博客所有文章除特别声明外,均采用: 署名-非商业性使用-禁止演绎 4.0 国际协议,转载请保留原文链接及作者。