一、杂谈
1、有人生在罗马,有人生来牛马;
2、这是一个信息爆炸、信息传播飞速的时代,然而给咱们这群人们带来了更多不必要的焦虑,患得患失。收藏那个学习视频、收藏这本学习电子书,偶尔看看那个大佬的直播,偶尔看看这个大佬的文章。就是没啥行动力去写写代码,或者坚持不了多久就不想继续了。其实这些都很正常。因为这些教学视频、学习资料大部分都是在培养“牛马”,如何成为“牛马”,如何做好一个“牛马”,就是不会告诉你如何做自己。其次这些视频、学习资料的内容都非常相似,就像是相互抄袭的一样,没太多自己的思考。这就导致咱们牛马行动不了,学不下去,却又能经常打啦鸡血一样重复这些步骤。最后一次又一次发现离现实差太多了,最后不了了之,最后焦虑生病,最后只能躺平。
3、我想说的是要做自己,不要做“牛马”。
1、不能听风就是雨,比如最近几年AI高速发展,那些专家们经常说AI即将取代程序员啦,
2、有选择的学习,不要什么教学视频或直播都去看,或者学习书本都去收藏都去看,对你而言没啥用的。因为他们也是急功近利的,大多是抄袭的,没什么自我思考的。只有刚好用到它才有可能给于你帮助。
3、好好照顾自己,注重自己的身心健康,规律生活,不要焦虑,安排好自己的计划,每天完成就行啦,不要给与自己太多压力
4、学而思、思而行,行而学。为啥看来那么多视频或者学习资料,但还是没啥进步,因为你没有自己去思考,更别提行动,更别为验证自己的思考而去行动了
4、暂时这么多了,生活是自己的,自己拥有的拥有是有限的,过好自己的每一天!下面开始正题,我自己对设计模式的形意理解
二、代理模式(增强访问与控制)
1、定义:当无法或不想直接引用某个对象或访问某个对象存在困难时,可通过代理对象来间接访问
2、目标:
1、保护目标对象:由代理对象决定目标对象的访问权限,所以代理对象需要包装目标对象,但是只包装一层
2、增强目标对象的访问和控制:被代理的原逻辑的前后执行代理对象自己的业务。在代理方法中委托给目标方法的前后可增加代理自己的业务逻辑,而这些业务逻辑是一些控制对目标方法的访问和控制,或者为目标提供额外的功能(预处理,记录日志、缓存、安全控制、资源管理)等,但是不一定与目标方法有直接关联,也不是增强目标方法的核心业务功能。
3、通用形式:
1、定义目标接口Subject,定义exec()方法
2、定义实现目标接口的真实目标类RealSubject,实现exec()方法
3、定义实现目标接口的代理类Proxy
1、持有目标接口Subject subject。
2、exec方法实现中,在合适位置委托给subject,即subject.exec()
4、动态代理:在运行时动态来创建代理类
1、原理:字节重组,在指定位置上生成实现目标接口或继承目标类的代理类class文件,将代理类class加载到内存中,创建代理对象。
2、JDK动态代理
1、定义目标接口
2、通过Proxy类的newProxyInstance方法创建代理对象
3、定义一个类实现InvocationHandler接口。通常在invoke方法中添加前置处理、目标方法调用和后置处理等逻辑。
3、CGLib动态代理:目标对象无需实现任何接口,因为它是创建了一个继承目标类的代理类来实现动态代理。所以不能代理final类
1、定义一个实现MethodInterceptor接口的类(代理拦截器)
2、拦截器中实现拦截方法,在合适的位置调用目标方法
3、创建某个目标对象的代理对象,并将上面拦截器注入
三、门面模式(接口整合一体化)
1、定义:提供了一个统一的接口,用来访问子系统中的一群接口
2、目标:为调用方而整合各个组件的业务步骤(即方法调用)成一个简单功能一体化接口供调用方调用
1、整合接口:将原本由调用方直接调用的一系列步骤,抽取封装到一个统一的门面接口中
2、简化接口:对于调用方而言,只需调用这一个一体化接口即可,而不像原来那样把繁杂的步骤都一一调用
3、通用形式:
1、定义各个子系统框架
1、定义子系统类
2、定义业务方法
2、定义门面框架
1、定义门面类
2、门面类中定义的门面方法将整合来自子系统中的相应业务方法(调用的安排)
四、装饰模式(增强核心业务)
1、定义:在不改变原有对象的基础下,动态地给该对象添加一些额外的职责功能
2、目标:通过包装和扩展,动态的对现有对象的业务功能进行增强,所以增强的业务逻辑必然与业务核心功能要保持高度的关联性和一致性(即增强核心业务逻辑)
3、特点:
1、可能会影响原有业务功能
2、可以嵌套装饰多层,形成装饰链
3、可定义各种装饰器作为模块,然后按需求分门别类的组装,得到定制化效果
4、通用形式:
1、定义抽象组件,定义业务方法
2、定义实现抽象的具体组件,实现业务方法
3、定义实现抽象的抽象装饰器,可省略
1、注入并持有组件
2、实现方法,该方法中可增加装饰功能也可直接委托给组件的业务方法
4、定义实现抽象装饰的具体装饰器,
1、实现方法,该方法中可增加装饰功能也可直接委托给组件的业务方法
五、享元模式(享元与管理)
1、定义:针对频繁创建且细粒度的享元对象进行创建和缓存,减少相同或相似对象的创建和销毁,节省内存开心。
2、目标:细粒度和共享对象
1、细粒度:细粒度必然会使得缓存的对象是又多性质又相近
2、享元对象:针对对象的使用场景,自行判断该对象是否频繁使用,是否需要共享,需判断哪些属性是内在状态,哪些属性是外在状态
1、内在状态:对象中固有属性,不随环境或使用情况改变而改变,可共享,仅提供getter方法,并在对象创建时需要初始化并不能被修改了
2、外在状态:对象中外部属性,与特定场景或上下文关联,随使用环境的不同而改变,不可共享,需提供getter和setter(或修改状态)方法。外在状态的管理更灵活,可依据具体应用场景的需求来设计
3、适用场景:
1、常用于系统底层的开发,以解决系统的性能优化问题
2、系统有大量相似对象,需要缓存池的场景
3、对象池化思想:对象池负责创建和缓存对象,当调用方申请需要时从池中取出对象给调用方。当调用方用完时将对象返回到缓存中。
4、通用形式
1、定义享元框架
1、抽象享元组件
1、内在和外在状态的getter
2、定义共享操作
3、更新外在状态方法
2、定义实现抽象的享元类,实现抽象方法
2、定义该组件的享元工厂
1、具有缓存池:缓存享元对象
2、创建享元对象,在特定时机创建,可以有外部工厂提供,并将享元添加到缓存池
3、非享元对象的工厂方法
六、组合模式(管理&成员结构的行为统一)
1、定义:组合模式允许你将对象组合成树形结构来表现“整体-部分”层次结构,使得用户对单个对象和组合对象的使用具有一致性。组合模式能够让客户端以相同的方式处理单个对象和对象的集合,简化了高层模块的复杂性,使之不必关心处理对象的具体类型。
2、角色:
1、成员角色:提供自身的业务方法
2、管理员角色:提供管理成员的相关方法,并针对业务方法的功能意义提供相应的实现(自身做处理或委托给成员处理),即保证行为一致性
3、目标:统一既存在成员又存在成员的管理者的数据结构的行为,以方便调用方对这种数据结构的访问操作
4、特点:
1、一致性:使得叶节点和组合节点在行为上保存一致(提供相同的方法),让调用方可以用同样方式来处理所有对象,而无需关心对象的类型
2、扩展性:当增加新的组件(类)到该组合框架下时,只需组件实现框架提供的接口,就能无缝融入现有系统。
3、便于操作复杂结构:简化了对复杂树形结构的操作,如遍历、查找、插入、删除等,通过提供统一的接口,客户端可无差别操作整个结构
4、便于递归算法的实现:由于所有对象都遵循相同的接口,因此可很容易编写递归算法来处理整个组合结构,而不用针对叶节点或组合节点分别写代码
5、通用形式:
1、定义抽象类,定义管理成员(插入、删除、遍历成员)的方法和成员的业务方法
2、定义实现抽象类的成员类,实现成员的业务方法,而管理方法抛异常
3、定义实现抽象类的管理类,实现管理方法和业务方法。