设计模式思考与实践
宝山就在眼前,不要只捡起了芝麻。
Tellme3
任务艰巨在于漫长。
展开
-
52、软件设计原则(合成复用原则(复用))
继承复用优点:简单易实现继承复用缺点:破坏了类的封装性,因为继承会将父类的实现细节暴露给子类(子类可以继承重写父类功能),父类对子类完全透明,又叫白箱复用子类和父类的耦合性高,父类的任何改变都会导致子类的实现发生变化,不利于后面的扩展和修改复用灵活性低,从父类继承的实现是静态的,是编译的时候就已经定义,运行时是不会发生任何改变的合成复用优点:维护了类的封装性,因为成员变量的内部细节是新对象看不见的。又叫黑箱复用对象之间的耦合度低,可以给类对象抽出一层接口,我们类中放置的是这个接口的实现类对原创 2023-10-05 12:01:12 · 111 阅读 · 0 评论 -
51、软件设计原则(迪米特法则(代理))
首先分析一下粉丝、公司、明星和经纪人的关系都为聚合关系,因为其三者是项目独立的,没有经纪人类将三者聚合起来都没有任何作用的只是对象而已,所以经纪人类控制着三者对象的生命周期。为聚合关系(实现+空菱形)原创 2023-10-05 12:00:22 · 63 阅读 · 0 评论 -
50、软件设计原则(迪米特法则(代理))
概念: 最小知识原则,你和直接的朋友交谈,不和陌生人说话。也就是我们说的找中介如果两个软件实体,无须直接通信的话就不应该发生直接的互相调用,可以使用第三方转发调用。(降低类之间的耦合性,提高模块的独立性)朋友有那些:当前对象 和 对象本身(类和自己类对象)当前对象 和 成员对象(类对象和里面的成员对象)当前对象 和 当前对象创建的对象(类和在类里面创建的对象)当前对象 和 当前对象的方法参数(类和自己对象创建的方法参数?)原创 2023-10-05 11:59:28 · 59 阅读 · 0 评论 -
49、软件设计原则(接口隔离原则)
将其一个大的接口拆分为多个接口,然后实现类按照自己的需求多实现自己的接口(类是可以实现多个接口的)原创 2023-10-05 11:58:35 · 45 阅读 · 0 评论 -
48、软件设计原则(接口隔离原则)
概念:客户端被迫不应该依赖他不使用的方法,一个类对另一个类的依赖应该建立在最小的接口上例如:我们有一个类里面有三个方法,我们客户端现在需要这个类了,于是我们在客户端中创建其成员变量使用,但是现在就存在一个问题了,若是我们的一个新用户只想要使用其中的两个方法?那我们可能就需要去重新创建类了。不能复用之前有的功能就很操蛋了原创 2023-10-05 11:57:46 · 35 阅读 · 0 评论 -
47、软件设计原则(依赖倒转原则)
给每个底层模块抽象出一个接口,这样我们若是想要使用新的cpu,就只需要在测试类中new新的cpu对象放进Computer的方法就行了,没有改动Computer原创 2023-10-05 11:56:46 · 30 阅读 · 0 评论 -
46、软件设计原则(依赖倒转原则)
依赖倒转原则(是开闭原则的具体实现)概念:高层模块不应该依赖底层模块,高层模块和底层模块都应该依赖细节(也就是底层模块抽取出来的父接口,或者抽象类),细节应该依赖抽象。也就是说我们应该对抽象进行编程,而不是对具体的实现进行编程。例如:其中A类里面有B类的成员变量,也就是A类依赖于B类,A类也就是高层模块,B类也就是底层模块(一个具体的类)。我们应该将B类抽象出一个接口或者一个抽象类出来,这样我们A类和B类都去依赖这个接口。原创 2023-10-05 11:54:33 · 42 阅读 · 0 评论 -
45、软件设计原则(里式替换原则)
重新设计(正方形不是长方形,违反里式替换原则)思路:我们为了解决问题,这里的操作是给其进行抽象出一个四边形接口,斩断正方形和长方形的继承关系,都变为四边形接口的实现类。(感觉有点问题,里式替换应该还是继承原则,只是子类不重写父类方法了)UML类图两个子类(实现关系:虚线+虚线三角形)测试类(依赖关系:虚线+箭头(其中的方法参数用到了接口和长方形类))原创 2023-10-01 23:24:23 · 40 阅读 · 0 评论 -
44、软件设计原则(里式代换原则)
里式代换原则概念:任何基类可以出现的地方(父类),那么子类一定也可以出现,也就是说子类继承父类的时候,应该扩展父类没有的方法,但是最好不要重写父类的方法。多态使用时候容易出现错误经典错误案例(违反里式代换原则)正方形不是长方形,众所周知正方形是长方形,其中长方形父类出现的地方,其正方形应该也可以替换父类长方形运行原创 2023-10-01 22:40:16 · 41 阅读 · 0 评论 -
43、软件设计原则(开闭原则实践)
软件设计原则(开闭原则实践)原创 2023-10-01 22:39:14 · 39 阅读 · 0 评论 -
42、软件设计原则(开闭原则)
开闭原则概念:对扩展开发,对修改关闭(也就是我们存在抽象接口或者抽象类,当我们想要添加功能的时候只需新增接口的新的实现类而不是只有一个类,去里面修改类的方法加什么if,else啊)实现形式: 接口(接口+实现类(实现关系))或者抽象类(抽象类+子类(继承关系))例如:我们搜狗输入法,其中我们想要加一个新的皮肤,我们发现每个皮肤都有一个共同点(那就是输入法的背景、窗口颜色、声音等等),我们将其抽象为一个抽象类AbstrackSkin(这里使用的是抽象类的形式来实现,而且根据阿里巴巴开发规范,其中抽象类前原创 2023-10-01 22:38:10 · 37 阅读 · 0 评论 -
41、UML类图(依赖关系、继承关系)
依赖关系(箭头+虚线(使用类指向被依赖的类))• 性质: 依赖是一种使用关系,对象之中耦合度最低的关联方式也叫做临时性关联• 概念: 一个类的局部变量、局部方法的参数、静态方法的调用来访问另一个类(也就是需要使用另一个类的方法来完成些东西)继承关系 Extend(实线的空心三角(子类指向父类))• 性质: 是耦合度最大的一种关系,是父类和子类的关系• 概念: 可以通过面向对象的继承extend来实现继承关系(泛化关系)原创 2023-10-01 22:37:00 · 69 阅读 · 0 评论 -
40、UML类图(聚合关系和组合关系)
聚合关系(一个空白菱形实线(部分指向整体))性质: 是一个强关联关系,是整体和部分之间的关系概念: 成员对象是整体对象的一部分,但是成员对象可以脱离整体对象而独立存在,例如:学校和老师的关系,其中学校包含了老师,但是若是学校停办了,其中老师还是存在的没有影响,也就是说其中只是学校这个类其中存在老师这个类的对象为成员对象原创 2023-10-01 22:35:58 · 158 阅读 · 0 评论 -
39、UML类图(类和类之间的关系)
uml关系(三大类)关联关系(三大关系)一般关联关系单向关联 : 一个实心三角形+实线(持有成员变量类指向其中的成员变量类)双向关联 : 一条实线自关联 : 一条自己指向自己的单箭头实线聚合关联关系: 一个空白菱形+实线(部分指向整体)组合关联关系: 一个实心菱形+实线(部分指向整体)依赖关系: 箭头+虚线(类执行被依赖类)继承关系: 空白三角形 + 实线(子类指向父类)实现关系: 虚线三角形 + 虚线(实现类指向接口)原创 2023-10-01 22:35:04 · 46 阅读 · 0 评论 -
38、UML类图表示法(类图的规范和类图中符号的意义)
UML类图中的三大结构类名属性方法类图中的三大符号(属性和方法中的三大符号)+ :表示public- :表示private# :表示protected标准写法:(【表示可以省略】最好还是写上)属性写法标准:可见性+名称+:+类型+【初始值】方法写法标准:可见性+名称(参数列表)+:【返回类型】原创 2023-10-01 22:17:24 · 81 阅读 · 0 评论 -
37、UML(类图)
UML概念:是设计软件的可视化语言,简单,而且图形化分类:用例图、类图、对象图、状态图、活动图、时序图、协作图、构件图、部署图等九种图类图类图是显示模型的静态结构(模型中的类之间的关系,和类的内部结构),类图不显示暂时性的信息原创 2023-10-01 22:16:31 · 24 阅读 · 0 评论 -
36、设计模式分类
三大分类创建型模式结构性模式行为型模式创建型模式用途:如何创建对象特点:将创建对象和使用分离成员:单例、原型、工厂方法、抽象工厂、建造者设计模式结构型模式用途:将类和对象按照某种结构组装为一个更大的结构成员: 代理、桥接、适配器、装饰、外观、享元、组合设计模式行为型模式用途:用于描述类和对象如何协作完成单个对象无法完成的任务,如何分配职责成员: 方法、策略、,命令、责任链、状态、中介者、迭代器、访问者、备忘录、解释器等设计模式原创 2023-10-01 22:15:32 · 26 阅读 · 0 评论 -
35、结构型模式(适配器模式(对象适配模式))
我们前面的问题是,若是其中SDCard 没有这个抽象接口了,只有下面的类,我们我们不就无法同时继承两个类了?解决思路我们只能继承一个那么我们就将我们适配器类的继承拿下来,我们在里里面使用构造方法或者注入进来实现之前的继承效果,那不就将继承的位置空置出来的嘛在new对象创建对象实例的时候调用了有参构造,用于初始化对象的状态。就是方法和类名相同的叫构造方法!方案一:可以用其中的这个set方法。方案二:可以用其中有参构造(原创 2023-09-26 00:28:59 · 41 阅读 · 0 评论 -
34、结构型模式(适配器模式实现方式类适配模式和不足之处)
定义一个适配器类实现实现当前业务的接口(三座充电),还要继承当前的存在的组件(二座充电器),也就是extend+implements 通俗一点的来讲就是我们要继承欧洲那边业务充电,还得是继承手中只有的二座充电器业务实践(电脑使用读卡器适配电话卡)现在我们手中只有一台电脑,这台电脑还只能读取SD卡,而我们现在想要他读取TF卡,那么我们就需要创建一个读卡器来进行适配将TF的内容进行读取原创 2023-09-22 00:35:20 · 38 阅读 · 0 评论 -
33、结构型模式(适配器模式结构)
三个主要角色:目标接口(Target):我们业务系统期待的接口或者抽象类,也就是我们想要使用的东西,例如:到国外我们就是想要用那个三座的插口了适配者接口(Adaptee):就是我们适配前已经存在的接口例如:就是我们在手中的国内的两座充电器了适配器接口(adapter):是一个转换器,通过继承或者引用其中的适配者对象,将其转换为目标接口,让客户还是按照目标接口访问使用我们原创 2023-09-22 00:33:02 · 22 阅读 · 0 评论 -
32、结构型模式(适配器模式概述)
将一个类的接口转换成客户希望的另一个接口,让两个原本因为接口不兼容的类能够一起工作使用适配器模式分类:类适配器模式:使用的是继承的模式,耦合度更高,然后若是我们想要适配的就是一个类的话就不行,上面有一层抽象接口我们才有办法对象适配器模式:使用的是聚合或者组合的模式耦合度更低一点原创 2023-09-22 00:31:56 · 25 阅读 · 0 评论 -
31.设计模式-结构型模式-静态代理案例(火车站卖票)
31.设计模式-结构型模式-静态代理案例(火车站卖票)其中我们的代理类和真实类都实现了抽象接口的方法(卖票功能都是抽象出来的,然后两者都实现都具有卖票这个功能)我们的代理类需要聚合真实类的对象然后用这个对象调用其中的方法(也就是代理商的卖票是用的火车站的卖票功能)原创 2023-09-06 00:30:09 · 35 阅读 · 0 评论 -
30.设计模式-结构型模式-代理对象概述
当我们访问对象(也就是买电脑的人),不适合或者不能直接访问目标对象(联想),那么我们就通过其中的代理对象(代理商)来进行操作。对真实主题的引用,可以访问、控制或者扩展(增强)真实主题的功能。30.设计模式-结构型模式-代理对象概述。代理模式: (根据生成时机的不同)是最终要引用的对象(联想)原创 2023-09-06 00:28:07 · 32 阅读 · 0 评论 -
29.设计模式-创建者模式-jdk源码解析(单列集合获取迭代器方法Collection.iterator方法)
Iter(ArrayList类的私有内部类)所以我们看一下ArayList有没有重写Collection接口的iterator(返回具体的对象Iter)Iter具体实现了Iterator接口其中的next方法和hashNext方法。所以其中Iter就是具体商品类,Iterator接口 是抽象商品类。我们转向到ArrayList(首先其中实现了List接口(List接口就是继承了Collection接口))我们先看Collection接口(里面有一个定义的抽象的Iterator接口的iterator方法)原创 2023-09-06 00:26:29 · 34 阅读 · 0 评论 -
28.设计模式-创建者模式-模式扩展(简单工厂模式+配置文件(创建对象,干掉工厂接口和工厂实现类))
我们这里的扩展其中就是使用通过用配置文件加工厂模式,干掉工厂模式的工厂接口和那些工厂实现类。通过一个容器来读取配置文件创建对象。28.设计模式-创建者模式-模式扩展(简单工厂模式+配置文件(创建对象,干掉工厂接口和工厂实现类))原创 2023-09-06 00:19:12 · 52 阅读 · 0 评论 -
27、设计模式-创建者模式-抽象工厂模式的优缺点及使用场景
一个实例里面的东西是一套可以配套使用,当我们这个实例确定的时候用其他的系列产品是不行的。换东西就一套都换掉,例如输入法换皮肤其中logo,颜色、背景都换掉了这种。添加先产品,工厂类都需要改动(因为需要在接口里再加一个方法了)27、设计模式-创建者模式-抽象工厂模式的优缺点及使用场景。原创 2023-09-06 00:13:56 · 36 阅读 · 0 评论 -
26、设计模式-创建者模式-抽象工厂模式案例(系列和产品)
26、设计模式-创建者模式-抽象工厂模式案例(系列和产品)首先我们要分析好,其中是有两个系列(一个美式风味,一个意大利风味)也就是会有两个具体的实现工厂其中有一个系列有两个产品所以接口(接口就是个总接口随便取,里面的方法是要创建后面的产品)也就是两个抽象方法两类抽象产品,4个具体产品原创 2023-09-02 10:31:16 · 43 阅读 · 0 评论 -
25、设计模式-创建者模式-抽象工厂模式概述
结构:(也就是说接口为系列不同产品(这里是里面的抽象方法),具体工厂为不同系列(这里是一个个具体工厂类),两者相乘即为整体)或者我们更好理解就是我们看一下具体的工厂类了,其中所有的工厂类*里面的实现方法就是全部!也就是我前面总结的,工厂方法模式是考虑的生产一种产品(多种产品容易类爆炸),而我们抽象工厂模式就是为了解决这个问题的(生产一系列产品)那么他的实现方法就抽象到一个接口里了,然后通过具体方法类也是统一实现(看见了吧,其中的概念就是我们知道一个系列工厂,那么我们就知道里面的一个系列的所有制造方法了。原创 2023-09-02 10:28:53 · 40 阅读 · 0 评论 -
24、设计模式-创建者模式-工厂方法模式优缺点
我们其中的工厂接口方法只有一个方法(生产一个产品),是不是感觉他太摸鱼了。所以我们使用抽象工厂其中它可以生产一类产品(例如它可以生产一系列东西:华为的手机、电脑、平板,而不是其中只干咖啡这一个东西了)总结一下也就是工厂方法模式只考虑到了横向发展(瑞幸咖啡、美式咖啡),而抽象工厂模式考虑的是纵向的发展,(干一系列事)24、设计模式-创建者模式-工厂方法模式优缺点。如何改进:(抽象工厂方法)原创 2023-09-02 10:27:25 · 42 阅读 · 0 评论 -
23、设计模式-创建者模式-工厂方法模式(通过工厂接口而不是工厂类来完美解决开闭问题)
其中我们要知道这个工厂模式的特点是什么,就是其中的我们再加一层将前面的工厂类变为一个工厂接口(只有抽象方法,而没有具体的实现),然后实现是通过下面具体的工厂实现类原创 2023-09-02 10:26:20 · 31 阅读 · 0 评论 -
21、设计模式-创建者模式-简单工厂模式(不是一种设计模式而是一种编程习惯,创建对象,实现对对象的解耦)
设计模式-创建者模式-简单工厂模式(不是一种设计模式而是一种编程习惯,创建对象,实现对对象的解耦)抽象产品:前面案例的抽象类Coffee就定义了规范和功能具体产品:就是前面的那两个子类具体工厂:就是我们的工厂类(用来创建对象)原创 2023-08-30 23:44:15 · 47 阅读 · 0 评论 -
20.设计模式-创建者模式-点咖啡案例(工厂是用来干什么的?生产对象的,解耦的)
设计模式-创建者模式-点咖啡案例(工厂是用来干什么的?生产对象的,解耦的)原创 2023-08-30 23:39:40 · 35 阅读 · 0 评论 -
2、设计模式-设计原则(里氏代换原则(正方形不是长方形改进版)
设计模式-设计原则(里氏代换原则(正方形不是长方形改进版)原创 2023-08-23 20:45:47 · 57 阅读 · 0 评论 -
1、设计模式-设计原则(里氏代换原则概述和案例(正方形不是长方形(我们需要的是正方形不是长方形)))
设计模式-设计原则(里氏代换原则:子类可以扩展,但最好不要改变父类的原有功能)原创 2023-08-23 20:44:26 · 57 阅读 · 0 评论 -
状态设计模式(一种行为型设计模式,告别字段不同状态的ifelse操作)
状态设计模式(一种行为型设计模式,告别字段不同状态的ifelse操作)解释:允许对象在内部状态改变时改变其行为,使得对象看起来好像修改了其类。核心思想:将对象的状态抽象成独立的类,使得对象在不同状态下具有不同的行为。原创 2023-07-31 23:57:35 · 107 阅读 · 0 评论 -
1、单例模式(饿汉模式和懒汉模式、双重锁定检测实现单例模、1式、类对象的反射机制、final的用法、Juit框架的比较方法assertEquals、AtomicInteger一种原子性整数类型。
一文学会单例模式,同步代码块后,还没有创建实例时,其他线程会一直等待。需要注意的是,这种方式虽然可以保证线程安全,但是在某些JVM环境下,由于JVM的优化等原因,可能会存在重排序问题,因此需要使用volatile关键字来防止这种问题的发生。在单线程环境中,只需要检查一次,但在多线程环境中,可能会有多个线程同时通过第一次检查,然后只有一个线程会获得锁并创建实例,其他线程需要等待。此时,计数器的值被正确的累加到了3,但是线程B在执行时读取到的计数器的值是中间状态的值2,而非最终值3,因此导致计数器的值不正确。原创 2023-05-16 12:11:08 · 128 阅读 · 0 评论