大班模型行为PK(总结)

行为类模式包括责任链模式、命令模式、解释器模式、迭代模式、中介模式、备忘录模式、观察者模式、State模式、策略模式、模板方法、Visitor模式,我去,许多。。

。主要有以下挑几个easy混乱和控制指令更重要方式。

、命令模式VS策略模式

1、关注点不同

策略模式关注的是算法替换的问题:一个新的算法投产,旧算法退休,或者提供多种算法由调用者自己选择使用,算法的自由更替是它实现的要点。

换句话说,策略模式关注的是算法的完整性、封装性,仅仅有具备了这两个条件才干保证其能够自由切换。

命令模式则关注的是解耦问题。怎样让请求者和运行者解耦是它须要首先解决的。解耦的要求就是把请求的内容封装为一个一个的命令,由接收者运行。因为封装成了命令。就同一时候能够对命令进行多种处理。比如摊销、记录等。

2、角色功能不同

策略模式中的详细算法是负责一个完整算法逻辑。它是不可再拆分的原子业务单元。一旦变更就是对算法总体的变更。

命令模式傲游命令的实现,也就是功能的实现。

比如我们在分支中也提到接收者的变更问题。它仅仅影响到命令族的变更。对请求者没有不论什么影响,从这方面来说,接收者对命令负责,而与请求者无关,命令模式中的接收者仅仅要符合六大设计原则,全然不用关心它是否完毕了一个详细逻辑,它的影响范围也仅仅是抽象命令和详细命令。对它的改动不会扩散到模式外的模块。

当然,假设在命令模式中须要指定接收者,则须要考虑接收者的变化和封装。

3、使用场景不同

策略模式适用于算法要求变换的场景,而命令模式适用于解耦两个有紧耦合关系的对象场合或者多命令多撤销的场景。

二、策略模式VS状态模式

1、环境角色的职责不同

两者都有一个叫Context环境角色的类。可是两者的差别非常大,策略模式的环境角色仅仅是一个托付作用,负责算法的替换。而状态模式的环境角色不权权是托付行为。它还详细登记状态变化的功能。与详细的状态类协作,共同完毕状态切换行为随之切换的任务。

2、解决这个问题的重点不同

策略模式旨在解决内部算法怎样改变的问题,也就是将内部算法的改变对外界的影响减少到最小程序。它保证的是算法能够自由地切换。而状态模式旨在解决内在状态的改变而引起行为改变的问题,它的出发点是事物的状态,封装状态而暴露行为,一个对象的状态改变。从外界来看就好像是行为改变。

3、解决这个问题的方法不同

策略模式仅仅是确保算法能够自由切换。可是什么时候用什么算法它决定不了。而状态模式对外暴露的是行为,状态的变化通常是由环境角色和详细状态共同变化的。也就是说状态模式封装了状态的变化而暴露了不同的行为或行为结果。

4、应用场景不同

策略模式仅仅是一个算法的封装,能够是一个有意义的对象,也能够是一个无意义的逻辑片段,比方MD5加密算法。

其算法必须是平行的,能够相互替换,否则策略模式就封装了一堆垃圾。状态模式则要深圳市一系列状态发生变化的场景,它要求的是有状态且有行为的场景,也就是一个对象必须具有二维(状态和行为)描写叙述才干採用状态模式,假设仅仅有状态而没有行为,则状态的变化就失去了意义。

5、复杂度不同

从设计模式的角度分析,通常策略模式比較简单,这里的简单指的是结构简单,扩展比較easy。并且代码也easy阅读。而状态模式则通常比較复杂,由于它要从两个角色看到一个对象状态和行为的改变,也就是说它封装的是变化。要知道变化是无穷尽的,因此相对来说状态模式通常都比較复杂,涉及面非常多。尽管也非常easy扩展,可是一般不会进行大规模的扩张和修正。

三、观察者模式VS责任链模式

这两个好像没什么相似的?观察者模式中一个详细的角色既能够是观察者。也能够是被观察者,这样就形成了观察者链。

这与责任链模式很类似,它们都实现了事务的链条化处理。

1、链中的消息对象不同

从首节点開始到终于的尾节点,两个链中传递的消息对象是不同的。责任链模式基本上不改变消息对象的结构,尽管每一个节点都能够參与消费,可是它的结构不会改变。可是在观察者模式中是同意的,链中传递的对象能够自由变化。仅仅要上下级节点对传递对象了解就可以,它不要求链中的消息对象不可变化 ,它仅仅要求链中相邻两个节点的消息对象固定。

2、上下节点的关系不同

在责任链模式中,上下节点没有关系。都是接收相同的对象,全部传递的对象都是链首传递过来,上一节点是什么没有关系。仅仅要依照自己的逻辑处理就成,而观察者模式就不同了,它的上下级关系非常亲热,下级对上级顶礼膜拜,上级对下级绝对信任,链中的随意两个相邻节点都是一个坚固的独立团体。

3、消息的分销渠道不同

在责任链模式中,一个消息从链首传递进来后,就開始沿着链条向链尾运动,方向是单一的、固定的;而观察者模式则不同,有很大的灵活性。一个消息传递到链首后。详细怎么传递是不固定,可传输广播,是可能的跳方式传送。它取决于消息处理逻辑。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-10-25 19:11:45

大班模型行为PK(总结)的相关文章

详解thinkphp模型

模型这一块,Think PHP讲解的比较复杂,并且内部做了各种数据库兼容,我认为,虽然它做了这么多的兼容,但是并不代表我们要使用那么多晦涩的用法,事实上,那些用法是降低效率的. ORM:object relational mapping 对象关系映射,以中间件的形式存在. CURD: create update read delete ActiveRecord模式:领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录. 领域模型模式和模型类关系密切,这里

Django模型修改及数据迁移

Migrations Django中对Model进行修改是件麻烦的事情,syncdb命令仅仅创建数据库里还没有的表,它并不对已存在的数据表进行同步修改,也不处理数据模型的删除. 如果你新增或修改数据模型里的字段,或是删除了一个数据模型,你需要手动在数据库里进行相应的修改或者使用South.Django 1.7中已经集成了South的代码,提供了3个新命令: migrate: 用于执行迁移动作,具有syncdb的功能 makemigrations: 基于当前的model创建新的迁移策略文件 sql

django模型orm进行group by

场景:三个模型分别为教师,学生,课程.一个教师可主讲多门课程,但一门课程只能由一个教师主讲,即教师和课程是一对多的关系.一个学生可选多门课程,一门课程可被多个学生选,即学生和教师为多对多的关系. class Teacher(models.Model): name = models.CharField(max_length=20, verbose_name='教师姓名') def __unicode__(self): return self.name class Student(models.Mo

OSI/RM模型的编址方案与TCP/IP编址方案的对比

还是抛出老问题,IP地址到底是属于主机的还是属于网卡的?理解了这个看似无聊的问题,可以帮助你增强各种动态路由协议,IPv6等技术的理解深度.        请看我在2013年的一篇文章<闲聊计算机IP网络>,此文从技术的角度解释了该问题,本文将从另外一个角度来解释....        这个问题是在帮朋友设计一个IS-IS和IP Anycast相关模块时一起聊到的,由于朋友不想透露更多的细节,我也就不再说过多.仅仅针对问题而解释问题.        其实这个问题现在非常好回答,我们把IP地址换

阻塞队列模型和线程池

阻塞队列模型介绍 阻塞队列模型和线程池息息相关,因此本篇博客先介绍阻塞队列的相关知识.如下图所示: 首先我们来说,什么是Queue,然后在谈什么是BlockingQueue. 那么什么是Queue呢?一句话,就是一端进,另一端出,这样就形成了First In , First Out,即先进先出.而BlockingQueue只不过是在Queue的基础上进行了2个附加操作而已:如果Queue空,那么Out线程阻塞,如果Queue满,那么In线程阻塞. 理解了上面的Queue/BlockingQueu

TP中的模型关联的多对多关系

TP5中完全推翻了3.2的做法,不再使用原来的查询语句,比如select,join之类的条件查询.而是使用模型关联,一对多和多对多的关系进行关联.方便用户调用数据,减少代码的编写量. 下面直接开始上代码: role.php(model层) class Role extends Model{ public function Nodes() { return $this->belongsToMany('Node','RoleAuthorization','node_id','role_id'); }

Django模型的_meta编程

Python有反射机制,Django也不例外,也有很好的反射机制,每个Django模型都有一个属性_meta,_meta也有属性和方法,这些属性和方法反射出了模型的一些特性,如果_meta用的好的话,不仅可也是代码更加优美,而且还可以大大提高代码的通用性和重复利用性.下面主要介绍_meta的属性和方法. 在django项目中,定义一个模型,然后用dir()函数打印出该模型的_meta的属性和方法,结果如下: _meta的属性和方法 '__class__', '__delattr__', '__d

ThinkPHP 学习笔记 ( 三 ) 数据库操作之数据表模型和基础模型 ( Model )

//TP 恶补ing... 一.定义数据表模型 1.模型映射 要测试数据库是否正常连接,最直接的办法就是在当前控制器中实例化数据表,然后使用 dump 函数输出,查看数据库的链接状态.代码: public function testdb(){ $obj=M("User"); dump($obj); } 此时浏览器输出: object(Model)#5 (20) { ["_extModel:private"] => NULL ["db:protecte

各向异性扩散PM模型原理与C++实现

本文介绍了各向异性扩散PM模型,并给出了C++代码实现. 一.PM模型原理 其中,                                                      二.C++代码实现 MATLAB代码可参考:http://www.csse.uwa.edu.au/~pk/research/matlabfns/Spatial/anisodiff.m http://www.mathworks.com/matlabcentral/fileexchange/14995-aniso