设计模式之禅读书笔记

》设计原则《

》Single Responsibility Principle(单一职责原则)类只有一个修改的原因。

  ●类的复杂性降低,实现什么职责都有明确的定义。

  ●可读性高

  ●可维护性高

  ●变更引起的风险降低。

PS:基本不可能实现

》里氏替换原则:只要父类可以出现的地方,子类就可以出现。

》Dependence  Inversion Principle(依赖倒置原则)

  ●高层次模块不应该依赖低层模块,两者都应该依赖抽象。

  ●抽象不应该依赖细节,细节应该依赖抽象

》接口隔离原则:类之间的依赖关系应该建立在最小的接口上。

》迪米特法则:一个对象应该对其他对象有最少的理解。

》开闭原则:对扩展开放,对修改关闭。

  ●逻辑变化

  ●子模块变化

  ●可见视图变化

设计模式

》单例模式(Singleton Pattern):要求一个类只能生成一个对象,所有对象对他的依赖都是相同的。

类图:

优点:

  ●较少了内存开支,性能开销。避免对资源的多重占用。

  ●优化和共享资源访问。

缺点:

  ●扩展困难。对测试不利。

使用场景:

  ● 生成唯一序列号的环境。

  ●需要一个共享的访问点或共享数据。如web上的计数器。

  ●创建对象需要耗费的资源过多。如访问IO资源。

注意事项:

  ●线程同步的问题。

最佳实现:

  ● 在Spring中,每个Bean默认都是单例的。

》工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个对象。

类图:

优点:

  ●良好的封装。代码结构清晰。

  ●扩展非常优秀。

  ●屏蔽产品类。

扩展:

  ● 缩小为简单工厂。

  ●升级为多个工厂类。

  ●替代单例模式

  ●延迟初始化。

》抽象工厂模式:为创建一组相关或依赖的对象提供一个接口,却无需指定它们的具体类。

类图:

优点:

  ●封装性,工厂类创建需要的对象。

  ●产品族的约束为非公开的状态。

缺点:

  ● 产品族扩展非常困难。

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

类图:

  ●注:在软件开发的过程中,如果相同的代码拷贝过两次,就要对设计产生怀疑。

  ●为了防止恶意的操作,一般模板方法都加上final关键字,不如许复写。

优点:

  ●封装不变的部分,扩展可变的部分。

  ●提取公共代码,便于维护。

  ● 行为由父类控制,子类实现。

缺点:

  ●子类对父类产生了影响,会带来代码的阅读难度。

使用场景:

  ●可以把核心算法设计为模板方法。

  ●重构时,把相同的代码抽取到父类。

扩展:

  ●增加钩子方法,也就是说外界条件改变,影响到模板方法的执行。

》建造者模式:将一个复杂对象的构建与他的表示分离。是得同样的构建过程可以创建不同的表示。

  ● ArrayList和HashMap如果定义成类的成员变量,那你的方法中的调用一定要做一个clear的动作。以防数据混乱。

类图:

  ●product产品类:通常是实现了模板方法模式。

  ●Builder抽象构建者:规范产品的组件。一般由子类实现。

  ●ConcreteBuilder:实现抽象类所定义的方法,并返回一个组建好的对象。

  ●Director导演:负责安排已有的顺序。起到封装的作用。

优点:

  ●可以使客户端不必知道产品内部组成的细节。

  ●建造者独立,容易扩展。

  ● 便于控制细节。

使用场景:

  ●相同的方法,不同的执行顺序,产生不同的结果。

  ●多个部件,都可以装配到一个对象中,但是产生的运行结果有不同。

  ●产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能。

》代理模式:为其他对象提供一个代理以控制这个对象的访问。

类图:

  ●subject主题角色:普通的业务类型定义。

  ● Realsubject:业务逻辑的具体执行者。

  ●proxy:调用真实的类。

优点:

  ● 职责清晰,真实的角色实现实际的业务逻辑。不必关心其他的事情。

  ● 高扩展性:不管具体的主题如何变化,代理类都可以不用变。

注:String AOP是一个典型的动态代理的应用。

》》原型模式:用原型实例指定创建对象的种类。并且通过拷贝这些原型创建新的对象。

类图:

优点:

  ●  性能优良,原型模式是二进制流的拷贝,要比直接new一个性能好的多。

  ● 逃避构造函数的约束。

注:执行拷贝的时候不会运行构造函数。

  ● 浅拷贝:clone只拷贝本对象,其对象内部的数组,引用对象不拷贝。

注:在使用原型模式的时候,引用的成员变量必须是成员变量与是一个可变的引用变量才不会被拷贝。

  ●深拷贝:把引用变量单独拷贝。

注:深拷贝与浅拷贝不要混合使用。

      对象的clone与对象的final关键字是冲突的。要是用clone方法,就不要使用final。

》》中介者模式:用一个中介对象封装一系列对象的交互,中介者使各对象不需要显示地相互作用。从而松耦合。也可以独立的改变他们之间的交互。

类图:

  ●优点:减少类的依赖。降低了类之间的耦合度。

  ●缺点:中介者会膨胀的很大,逻辑复杂。

  ●MVC:C就是一个中介者。

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

 

 未完待续。。。。。。

 

转载于:https://www.cnblogs.com/skys-li/p/5363771.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql mysql_set_charset_SQL注入攻击之 mysql_set_charset [转]

本文转载地址:http://hi.baidu.com/cuttinger/blog/item/e9a93901934755147bec2cb0.html1。老话题,mysql_real_escape_string单引号,大多数情况下,防止sql注入攻击足够了。$mysql mysql_connect("host","user&quo…

idea导入maven项目依赖报错_解决Maven依赖冲突的好帮手,这款IDEA插件了解一下?

1、何为依赖冲突Maven是个很好用的依赖管理工具,但是再好的东西也不是完美的。Maven的依赖机制会导致Jar包的冲突。举个例子,现在你的项目中,使用了两个Jar包,分别是A和B。现在A需要依赖另一个Jar包C,B也需要依赖C。但…

Xilinx实习一年总结

从去年7月4号来到上海xilinx。转眼间已经一年。这一年学了非常多知识,也长了非常多见识。 去年七月一到公司,马上投入到摄像头-DDR-HDMI图像通路的研发中。就是在ZEDboard板卡上。通过外置摄像头採集图像,在PL部分将採集的像素数据进行拼接&a…

java线程创建方式_Java创建线程安全的方法

原文链接 译者:秦建平 校对:方腾飞首先来看一个问题:下面这个方法是线程安全的吗?如何才能让这个方法变成线程安全的?public class MyCount {private static int counter 0;public static int getCount(){return coun…

win7 能下node什么版本_微软从未公开的win10版本,3GB+极度精简,老爷机有救了

在windows家族中,最好用的就是win7和XP系统。堪称经典,而且还是发展最成功的系统版本。前几天韩博士也发布一篇关于XP系统的文章,评论区引发极大争论。大家众说纷纭,觉得XP系统是顺畅,但是很多软件硬件都不支持&#x…

【Swift学习】Swift编程之旅(一)

学习一门新语言最经典的例子就是输出“Hello World!” print("Hello World!")  swift就是这样来输出的。 如果你使用过其他语言,那么看上去是非常的熟悉吧。但比一些c要简单的多吧 1、不需要导入一些单独的库,比如输入/输出或字符…

孔夫子二手书采集

文章目录 项目演示软件采集单本数据网页搜索数据对比 使用场景概述部分核心逻辑Vb工程图数据导入与读取下拉框选择参数设置线程 使用方法下载软件授权导入文件预览处理后的数据 项目结构附件说明 项目演示 操作视频详见演示视频,以下为图文演示 软件采集单本数据 …

java总结体会_Java课程总结心得体会

不知不觉中以学习Java将近4个月了,在这几个月的学习中我从一开始的迷茫懵逼,到现在的懵逼迷茫中,写下了这篇这个学期课程的Java学习心得体会。首先,我认为作为一个该开始学习Java的小白,在开始学习之前无论你有多大的热…

为什么用redis做缓存而不是mybatis自带的缓存_如何用Java设计一个本地缓存,涨姿势了...

最近在看Mybatis的源码,刚好看到缓存这一块,Mybatis提供了一级缓存和二级缓存;一级缓存相对来说比较简单,功能比较齐全的是二级缓存,基本上满足了一个缓存该有的功能。当然如果拿来和专门的缓存框架如ehcache来对比可能…

process 类 java_编写可执行jar——java的Process类的使用(二)

你知道怎么在控制台使用ping吗?那你知道怎么在java中使用ping吗?1.批处理文件批处理文件大家一定不陌生。接触最多的应该就是tomcat中的start.bat或者start.sh了。bat是在windows环境下运行的批处理文件,sh则是linux的shell脚本。2.adb指令安…

python从爬虫到数据分析项目_零基础学习Python web开发、Python爬虫、Python数据分析,从基础到项目实战!...

随着大数据和人工智能的发展,目前Python语言的上升趋势比较明显,而且由于Python语言简单易学,所以不少初学者往往也会选择Python作为入门语言。Python语言目前是IT行业内应用最为广泛的编程语言之一,尤其是近几年来随着大数据和人…

java filedialog 打开文件_java 用文件对话框打开文件

//文件的打开import java.awt.FileDialog;import java.awt.event.*;import java.io.*;import java.io.File;import java.io.FileReader;public class FileOpen {private FileDialog filedialog_open;private String fileopen null, filename null;// 用于存放打开文件地址 和…

2782: [HNOI2006]最短母串

2782: [HNOI2006]最短母串 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3 Solved: 2[Submit][Status][Web Board]Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,…

c java 内部类_java程序中能否在内部类当中再定义一个内部类?

展开全部我被你的想62616964757a686964616fe78988e69d8331333363386664法震撼了,哈哈.亏你想的出来...这么弄代码不好理解,Java看起来醒目,也是Java中的一个规范!可以吗?必须可以..看代码演示...声明下,我也第一次,多次嵌套,看你想法后去试验下是可行的我用的两种办法!不多说看…

pythongui做计算器_python 实现简单的计算器(gui界面)

运行效果:完整代码from tkinter import *def click(num):global opopopstr(num)iptext.set(op)def evaluate():global opoutputstr(eval(op))iptext.set(output)def clearDisplay():global opop""iptext.set(op)calcTk()calc.title("TechVidvan Calc…

ios学习笔记——RunTime

Objective—C是面向运行时的语言,就是说它会尽可能的把编译和链接时要执行的逻辑延迟到运行时。这就给你很大的灵活性,你可以按需要把消息重定向给合适的对象,你甚至可以交换方法的实现。最重要的还是消息机制。 C语言使用“静态绑定”&#…

exhaustion java_Java Player.setExhaustion方法代碼示例

import org.bukkit.entity.Player; //導入方法依賴的package包/類/*** Set SamaGamesAPI*/Overridepublic void startGame(){this.getInGamePlayers().forEach(((uuid1, survivalPlayer) -> survivalPlayer.getPlayerIfOnline().closeInventory()));super.startGame();Objec…

python内存池机制_python的内存管理机制

一、python是一个什么样类型的语言1、python是一种动态解释性强类型定义的高级、通用性编程语言。解释型:执行的时候,才一条一条的解释成机器语言给计算机来执行。如:python、js、ruby、PHP等编译型:把源程序的每一条语句都编译成…

MATLAB GUI不同控件函数间变量传递方法

在GUI中一个控件函数结束后,会将在这个函数中使用的变量全部删除,如果想在另一个控件中使用,则必须想办法将这个变量保存传递,方法有以下几种:1、使用globe定义全局变量,这种方法不是很好,一方面…

java变量数据类型_java变量与数据类型

第二章 变量与数据类型变量变量的概述变量是指内存中的一个存储区域,该区域要有自己的名称(变量名)、类型(数据类型),该区域的数据可以在同一数据类型的范围内不断变化值。每个变量都有自己的作用范围,叫作用域变量的注意事项1.Java中的变量必…