大话设计模式(读后感)——23种设计模式六大原则AnglusWang

1、单一职责原则(SRP:Singleresponsibilityprinciple)

就一个类而言,应该仅有一个引起它变化的原因;通俗的说,即一个类只负责一项职责

分析:

1、如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力;

这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。

2、软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。

3、如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责。

2、开放-封闭原则(OCP:OpenClosedPrinciple)

是说软件实体(类、模块、函数等等)应该可以扩展,但是不可以修改;

特征1:对于扩展是开放的(Openforextension);

特征2:对于更改是封闭的(Closedformodification)。

1、在我们最初编写代码时,假设变化不会发生;当变化发生时,我们就创建抽象来隔离以后发生的同类变化。

2、面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。

4、开发-封闭原则是面向对象设计的核心所在。遵循此原则可以带来可维护、可扩展、可复用、灵活性好的好处;

开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象,然而,对于应用呈现中的每个部分都刻意地进行抽象同样不是一个好主意;

拒绝不成熟的抽象和抽象本身一样重要。

3、依赖倒转原则()

A.高层模块不应该依赖低层模块。两个都应该依赖抽象

B.抽象不应该依赖细节,细节应该依赖抽象

1、就是要针对接口编程,不要对实现编程

无论主板、CUP、内存都是在针对接口设计的,如果针对实现来设计,内存就要应对到具体的某个品牌的主板,那就会出现换内存需要把主板也换了的尴尬;

2、高层模块不应该依赖低层模块,两者都应该依赖其抽象又如何理解呢?这个问题也可以这么问:为什么要叫倒置(倒转)呢?

在面向过程的开发中,为了使用常用的代码可以复用,一般都会把这些常用的代码写成许许多多函数的程序库,这样我们做新项目的时候,

就去调用这些函数就可以了。

例如:我们做的项目大多要访问数据库,所以我们就把数据库的代码写成了函数,每次做新项目时就去调用这些函数,这也就是高层依赖于低层模块了。

如果我们的高层模块和低层模块都依赖于抽象,具体一点就是依赖于接口或抽象类,只要接口够稳定,那么任何一个的更改都不用担心其他受到影响了。

4、里氏代换原则()

子类型必须能够替换掉它们的父类型

既:一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而其它察觉不出父类对象和子类对象的区别。

也就是说,在软件里面,把父类都替换成它都替换成它的子类,程序的行为没有变化。

1、正因为有这个原则,使得继承复用成为了可能,

只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。

2、正是由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展。

3、依赖倒转其实可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,

即使程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之那就是过程化的设计了。

5、迪米特法则(LKP:LeastKnowledgePrinciple,又叫最少知识原则)

如果两个类不必彼此直接通信,那么这两个类就不应当直接的相互作用;如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

1、在类的结构设计上,每一个类都应当尽量降低成员的访问权限;

2、其根本思想是强调了类之间的松耦合;

3、类之间的耦合越弱,越有利于复用,一个处于弱耦合的类被修改,不会对有关系的类造成波及。

6、合成/聚合复用原则

尽量使用合成/聚合,尽量不要使用类继承

优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上;

这样类和类继承层次会保持较小规模,并且不太可能增长为不可能控制的庞然大物。

1、合成(Composition)和聚合(Aggregation)都是关联的特殊种类;

2、聚合表示一种弱的“拥有”关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分;

3、合成则是一种强的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样

二、Java中的23种设计模式

1、单例模式——有些类也需要计划生育

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

所有类都有构造方法,不编码则系统默认生成空的构造方法,若有显示定义的构造方法,默认的构造方法就会失效。

1、通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象;

一个最好的办法就是,让类自身负责保存它的唯一实例;这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。

2、单例模式因为Singleton类封装了它的唯一实例,这样它可以严格地控制客户怎样访问它以及何时访问它。简单地说就是对唯一实例的受控访问。

实用类与单例区别?

比如实用类不保存状态,仅提供一些静态方法或静态属性让你使用,而单例类是有状态的;实用类不能用于继承多态,而单例虽然实例唯一,却是可以有子类来继承。

实用类只不过是一些方法属性的集合,而单例却是有着唯一的对象实例。

懒汉式单例类:可以延迟加载,多线程不安全

//懒汉式publicclassSingleton{privatestaticSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){instance=newSingleton();}returninstance;}}

饿汉式单例类:线程安全,加载类时就初始化完成不能延迟加载

publicclassSingleton{privatestaticSingletoninstance=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returninstance;}}

双重检查:多线程安全、延迟加载,同步耗时

publicclassSingleton{privatestaticSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){synchronized(Singleton.class){if(instance==null){instance=newSingleton();}}}returninstance;}}

静态内部类:多线程安全,延迟加载,比(双重检查)少耗时

publicclassSingleton{privateSingleton(){}publicstaticSingletongetInstance(){returnSingletonHolder.instance;}privatestaticclassSingletonHolder{privatestaticSingletoninstance=newSingleton();}}用缓存实现:线程安全,占用内存大

publicclassSingleton{privatestaticfinalStringKEY="instance";privatestaticMapmap=newHashMap<>();privateSingleton(){}publicstaticSingletongetInstance(){Singletonsingleton;if(map.get(KEY)==null){singleton=newSingleton();map.put(KEY,singleton);}else{singleton=map.get(KEY);}returnsingleton;}}

2、简单工厂模式——代码无错就是优?

简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的。

应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂

1、简单运算工厂类:

2、客户端代码:

所有在用简单工厂的地方,都可以考虑用反射技术来去除switch或if,解除分支判断带来的耦合

3、工厂方法模式——雷锋依然在人间

工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。

定义一个用于创建对象的接口,让子类决定实例化哪一个类;使得一个类的实例化延迟到其子类。

2、工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,

也就是说工厂方法把简单工厂的内部逻辑判断移动到了客户端代码来进行。你想要加功能,本来是改工厂类,而现在是修改客户端。

4、抽象工厂模式——就不能不换DB吗?

它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构。

1、好处一是易于交换产品系列,由于具体工厂类,例如:IFactoryfactory=newAccessFactory(),在一个应用中只需要在初始化的时候出现一次,

这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。

2、好处二是让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操作实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。

5、策略模式——商场促销

它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户

6、装饰模式——穿什么有这么重要?

动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活

7、原型模式——简历复印

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要指定任何创建的细节

8、模板方法模式——考题抄错会做也白搭

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤

9、外观模式——牛市股票还会亏钱?

为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用

10、建造者模式——好菜每回味不同

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

11、观察者模式——老板回来,我不知道

定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象;

这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己

12、状态模式——无尽加班何时休

当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类

主意解决:当控制一个对象状态转换的条件表达式过于复杂时的情况;把状态的判断逻辑移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化

13、适配器模式——在NBA我需要翻译

将一个类的接口转换成客户希望的另外一个接口;Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

14、备忘录模式——如果再回到从前

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态;这样以后就可将该对象恢复到原先保存的状态

15、组合模式——分公司=一部门

将对象组合成树形结构以表示'部分-整体'的层次结构;组合模式使得用户对于单个对象和组合对象的使用具有一致性

16、迭代器模式——想走?可以!先买票

提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示

17、桥接模式——手机软件何时统一

将抽象部分与它的实现部分分离,使它们都可以独立地变化

什么叫抽象与它的实现分离,这并不是说,让抽象类与其派生类分离,因为这没有任何意义;实现指的是抽象类和它的派生类用来实现自己的对象

18、命令模式——烤肉串引来的思考

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作

19、职责链模式——加薪非要老总批?

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系;

将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止

20、中介者模式——世界需要和平

用一个中介对象来封装一系列的对象交互;

中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互

21、亨元模式——项目多也别傻做

运用共享技术有效地支持大量细粒度的对象

可以避免大量非常相似类的开销

1、有时需要大量细粒度的类实例来表示数据,如果能发现这些实例除了几个参数外基本上都是相同的,有时就能够受大幅度地减少需要实例化的类的数量;

如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度地减少单个实例的数目

22、解释器模式——其实你不懂老板的心

给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子

1、当有一语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式

23、访问者模式——男人和女人

表示一个作用于某对象结构中的各元素的操作;

它使你可以在不改变各元素的类的前期下定义作用于这些元素的新操作

THE END
1.产品系列化编制产品系列型谱 因为社会对产品的需要是多方面的,只是对参数分档分级:有时还不能满足需要,还要求同一规格的产品有不同的型式,以满足不同的特殊要求。解决这个问题便是系列型谱的任务。系列型谱是对基本参数系列限定的产品进行型式规划,把基型产品的与变型产品的关系以及品种发展的总趋势用图表反映出来,形成一https://baike.baidu.com/item/%E4%BA%A7%E5%93%81%E7%B3%BB%E5%88%97%E5%8C%96/2143612
2.啥东西?能不能买?酷兽夜枭系列内存还要啥自行车内存在介绍产品之前,先介绍一下什么叫intel专用条,它与AMD专用条有何区别? 其实本质上是没有区别的,不论是intel专用条还是AMD专用条,它们本质上都是采用了4bit标准颗粒的内存条。在DDR3时,它叫AMD专用条,在DDR4时代,它叫intel专用条。能不能用,主要还是看CPU支不支持4bit颗粒。当年的AMD专用条,基本上所有的颗粒https://post.smzdm.com/p/akkqw548/
3.Contents/premium.mdatmaster·Newslab2020/Contents·GitHub592 德普vs艾梅柏:一场被直播的舆论狂欢 2020/6/16 发生在英国与美国的两个系列官司; 陪审团、直播、短视频、梗图; #MeToo与女权遭遇的反弹? 591 “自媒体”十年 2022/5/24 “自媒体”十年:流量生意,一地鸡毛; “自媒体推动民主化”的想象; 平台与内容工厂的合谋; https://github.com/Newslab2020/Contents/blob/master/premium.md
4.不知道叫什么?送你一份超全面的产品基础术语科普指南不知道叫什么?送你一份超全面的产品基础术语科普指南 设计师在日常沟通的时候,是不是经常会遇到说了半天结果大家说的不是一件事的情况?笔者认为,要解决这个问题,首先要统一名词,保证沟通的准确度。下面是笔者整理的一些关于 APP(小程序)名词的规范样例,希望能帮助到刚刚入行的同学们。https://www.uisdc.com/product-base-terminology/
5.如何从零开始解读什么叫产品经理51CTO博客如何从零开始解读什么叫产品经理 主题就是解析产品经理,一起了解下产品经理这个岗位,这个职业所要担负,所要解决的责任和问题, 岗位的了解,岗位的认知。也是对这个产品经理感兴趣或者想成为一个产品经理,或者已经是产品经理了想提高自己的能力。 ###(一)什么是产品经理 https://blog.51cto.com/u_12040702/5992525
6.一个产品的销售方案(100个令人拍案叫绝的创意促销方案,告诉你什么方案40:齐聚一堂——搭配出来的畅销(例:水果店把一些水果放在一个篮子了,这样即好看又实惠。同类产品组合销售就是好的方法。) 第一节 店铺广告促销 方案41: 现场效应——在现场为自己做广告(例:羽绒系列当场拆开衣服被褥让大家看内里的东西。卖点:眼见为实,口碑相传,邀请顾客体现互动行。) https://www.niaogebiji.com/article-483734-1.html
7.产品型谱的管理技巧一、 什么叫型谱及产品型谱? 简单直白的讲:型谱就是按型号规格进行排列建档的、由多个项目构成的组合。建立型谱是让我们能够清楚的、一目了然的查看各个项目相互之间的关联性及对比参照它们各自具有的功能特点、其本身独有的技术参数或是外形等。 产品型谱:是产品发展规划的核心内容,是用最少数目的不同规格产品http://www.360doc.com/content/12/0404/22/112112_200860091.shtml
8.什么叫VI设计?VI设计有哪些内容?我们都知道,如果一家企业形象不好,尽管其产品打折、优惠销售,也容易遭到社会公众的怀疑。所以说,一个品牌的形象至关重要。随着人们的品牌意识觉醒,vi设计成了这几年的设计流行。都在说VI设计,那么到底什么是VI设计呢?VI设计又有哪些内容?古柏广告设计就和您一探究竟吧。 https://www.goobai.com/vixw/1995.html
9.5分钟学完《梁宁产品思维30讲》《梁宁·产品思维30讲》以前看过一本书的名字叫做《人人都是产品经理》,现在梁宁老师的这门课程叫做“产品思维”,跟逆向思维、第一性思维一样,肯定都是人人可以学,也人人需要的一种思维能力。 产品能力是每个人的底层能力。产品能力就是训练一个人判断信息、抓住要点、整合有限的资源,把自己的价值打包成一个产品来向这个世界交付,并且获得https://blog.csdn.net/zhongguomao/article/details/82284342
10.一触“伙伴+华为”体系,传媒行业点亮数智之光3.产品专。结合传媒行业的差异化特点,华为推出了一系列专精的针对性解决方案。李腾提到,在AI方面,华为基于盘古L0模型训练出了L1媒体大模型,结合昇腾云服务与媒体引擎,构建了MetaStudio数字内容生产线,面向媒体行业提供从内容生产到内容处理、内容联接一系列服务,包括AIGC数字人,AI MPC内容处理、AIGC 3D等。华为提供的https://www.eet-china.com/mp/a370436.html