第二天:装饰模式及面向对象设计原则4则

装饰模式是为已有功能动态地添加更多功能的一种方式.
当系统需要新功能的时候,是向旧系统中添加新的代码.这些新加的代码通常装饰了原有类的核心职责或主要行为.这样的结果等同于在主类中加入新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要.

装饰模式把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地,按顺序地使用装饰功能包装对象了.

优点:
把类中的装饰功能从类中搬移去除,这样可以简化原有的类.
有效地把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰模式.


 

面向对象的四个好处:可维护,可扩展,可复用,灵活性好
单一职责原则:如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或者抑制这个类完成其他职责的能力.这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。

开放封闭原则是说软件实体(类,模块,函数等等)应该可以扩展,但是不可修改。
模块无法做到绝对封闭,但应在设计过程中,尽量猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化。

方法:
等到变化发生时立即采取行动,在我们最初编写代码时,假设变化不会发生变化。当变化发生时,我们就创建抽象来隔离以后发生的同类变化。
好处:
面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。

依赖倒置原则:抽象不应该依赖细节,细节应该依赖于抽象(例子:CPU,内存,主板等自己是根据标准接口设计的)

里氏替换原则:子类型必须能够替换掉它们的父类型。

由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展
程序中所有的依赖关系都是终止于抽象类或者接口,就是面向对象的设计.

应用一则:

数据持久化功能开发:
对此功能应用装饰模式, 数据->词汇过滤->加密->持久化(数据库(sql,oracle),文件).
绿色标识部分应该考虑使用策略模式,应对加密算法的改变.
蓝色划线部分应该考虑使用依赖倒置原则,定义公共接口.  持久化模块和使用者依赖公共接口.而互相不知道对方的细节。
虽然,面向对象设计原则已经学习了很多次了,也听了很多次了,但是仍然每学习一次就多一丝领悟加深一层理解。所谓笨鸟要靠时间积累才能飞,聪明的人也许看过一遍,两遍就学会了,那么我就看个八遍,十遍的,哪怕不会灵活运用也要理解精神。

转载于:https://www.cnblogs.com/neking/archive/2013/02/06/2904172.html

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

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

相关文章

linux ntfs 速度慢,将U盘磁盘格式改成NTFS解决u盘复制速度慢问题

1、我们首先要看看U盘的文件系统是哪个?打开计算机-可移动磁盘-右击属性。2、目前打多数U盘采用的都是FAT32格式,这也是大多数USB2.0船速速度比较慢的原因。我们先用文件大小测试一个它的读写速度,格子这里用的是一个大概四百兆的文件,为了让…

触发器的创建、修改和删除

一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约束。 二﹕ SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表。这两个表由系统来维…

Android之进程与线程的讲解

安卓平台中当首次启动运行一个组件的时候,Android会相应的启动了一个进程。默认的,所有的组件和程序运行在这个进程和线程中,也可以安排组件在其他的进程或者线程中运行。 进程:组件运行的进程由manifest file控制。组件的节点 —…

如何延迟一个 Task 的执行 ?

咨询区 Bruno Lopes我想实现一个可以在延迟 Xms 后执行一个 task 的需求,并要求能够实现在 xms 之前取消 task 的执行,我的参考代码如下:var _cancelationTokenSource new CancellationTokenSource();var token _cancelationTokenSource.To…

Xamarin.Android和UWP之MVVM的简单使用(二)

0x01 前言 前面一篇,Xamarin.Android和UWP之MVVM的简单使用(一),主要讲了MvvmLight的简单使用 这篇主要讲讲MvvmCross的简单使用,例子的话,还是和上篇的一样。直接进正题吧,不废话了。 0x02 简单的MVVM(mvvmcross) Dem…

ExtJs 带分页的comboBox

ExtJs 带分页的comboBox 如何得到当前第几页? 希望技术牛人能帮帮我,也可以加我扣扣【445958】, 交流JAVA Ext 框架等方面的技术!转载于:https://blog.51cto.com/ajiao13/1133773

C语言关系 是行还是列,C语言行优先和列优先的问题深入分析

C语言行优先和列优先的问题深入分析摘要本文主要探讨的是“行优先”原则和“列优先”原则的问题。1. 背景首先了解“行优先”和“列优先”的知识,这两种方式在数学上的直观描述如下,给定如下矩阵:根据行优先的原则,其排序方式为根…

软件工程之个人项目--词频统计

不得不说对于菜鸟级的我,这是一次心酸的经历啊。。。自打接到王老师布置的这个任务(个人项目)之后,我心里一直在想着自己要用哪种语言来完成我的任务。以前多多少少写过一些程序的,这又想起了数据库小学期与永哥和小强…

RC4加密解密java算法

有一个项目&#xff0c;需要解析一个用户提供的rc4加密后的文件&#xff0c;特意搜索整理了一个java 版本的RC4加解密算法。 public static String HloveyRC4(String aInput,String aKey) { int[] iS new int[256]; byte[] iK new byte[256]; for (int i0;i<256;i…

史上最被低估的神级学科,看完忍不住感慨“它”也太重要了!

▲ 点击查看著名物理学家、数学家曾说&#xff1a;几何学的简洁美&#xff0c;却又是几何学之所以完美的核心存在。几何始于数学&#xff0c;但它的意义和影响却远超数学。一个个枯燥的数字和一个个简单的图形&#xff0c;却可以帮助我们解决很多问题&#xff0c;了解自然的规律…

.NET6之MiniAPI(三):Response

MiniAPI中&#xff0c;Response的返回数据有三种格式&#xff0c;IResult&#xff0c;string&#xff0c;json&#xff1a;ValueTask<string> - 这包括 string 和 Task<string>T&#xff08;任何其他类型&#xff0c;返回前端时转成json&#xff09;- 这包括 Task&…

ffmpeg speex转换为mp3或者aac

2019独角兽企业重金招聘Python工程师标准>>> 输入&#xff1a; flv格式&#xff0c;视频264编码&#xff0c;音频speex编码 -8:[rootandrew ffmpeg-3.0./ffprobe test_speex1.flv 32:ffprobe version 3.0-static32: Copyright (c) 2007-2016 the FFmpeg developers3…

python 解析器的常用options

解释器options: 1.1 –d 提供调试输出 1.2 –O 生成优化的字节码(生成.pyo文件) 1.3 –S 不导入site模块以在启动时查找python路径 1.4 –v 冗余输出(导入语句详细追踪) 1.5 –m mod 将一个模块以脚本形式运行 1.6 –Q opt 除法选项(参阅文档) 1.7 –c cmd 运行以命令行…

c语言给bmp图片加滤镜,关于BMP位图透明通道的详解制作教程, 教你输出透明的BMP位图...

我是sjmhiex啊月谢谢大家的支持 百度贴吧&#xff1a;sjmhiex吧QQ群&#xff1a;243153684BMP支持透明比较常见的方法有两种&#xff1a; 一种是32位图&#xff0c;直接就可以是透明的&#xff0c;还可以是半透明效果&#xff0c;一般都是用PNG转成的&#xff0c;或者在保存图…

QM课程02-外部功能

质量计划 对质量计划和检验计划进行基本数据的管理 物料说明 检验计划 质量检验 触发检验 具有检验计划选择和样本计算的检验处理 打印采样和检验的车间文档 记录结果和缺陷 做出使用决策并触发后续行为 质量控制 在质量级别历史的基础上的动态样本确定 使用质量控制…

Android之Lollipop DevicePolicyManager学习(上)

Android 5.0(lollipop)发布之后&#xff0c;看特性文档增加了不少有趣的东西。 最近花了一些时间&#xff0c;研究了下其中Managed Profile的概念&#xff0c;简称MP&#xff0c;记录下来作为一些经验&#xff0c;有需要的同学请参考。 简介 Managed Profile&#xff0c;简称被…

c语言时间算法如何以毫秒显示,C语言时间的方法.doc

C语言时间的方法.docC语言获取系统时间的几种方式—源于网络C语言中如何获取时间&#xff1f;精度如何&#xff1f;1 使用time_t time( time_t * timer ) 精确到秒2 使用clock_t clock() 得到的是CPU时间精确到1/CLOCKS_PER_SEC秒3 计算时间差使用double difftime( time_t time…

简述JQuery,Extjs,YUI,Prototype,Dojo等JS框架的区别和应用场景

随着web2.0的彪悍发展&#xff0c;以及浏览器端所承载的工作越来越大&#xff08;在不是很影响性能的情况下&#xff0c;开发者都习惯把能用浏览器做的事儿都让浏览器做&#xff0c;以减轻服务器的压力和带宽费用等&#xff09;。所以Javascript已经成为了web开发最最基本的要求…

怎么向小学生解释欧拉公式 e^(πi)+1=0?

全世界只有3.14 % 的人关注了爆炸吧知识前几天&#xff0c;超模君空投了一个包裹给8岁表妹。不到三秒&#xff0c;表妹就从包裹里面拿出来一条毛毯&#xff1a;表哥&#xff0c;这个毛绒绒的毯子好舒服&#xff0c;我披着毯子写作业很暖和&#xff0c;但这个图案是啥&#xff0…