首页 > 其他分享 >设计模式中的单一职责: 一个MVC 场景的讨论

设计模式中的单一职责: 一个MVC 场景的讨论

时间:2024-09-01 11:37:14浏览次数:11  
标签:draw 场景 职责 依赖 模型 MVC 设计模式 unit

在MVC 模型中,M 代表模型。M中的信息可以访问到模型的信息。
我们在很多代码中看到,有些模型也负责draw 自身的逻辑。一个模型知道如何画自身似乎是很合理的。
如果细想一下,draw 跟模型中的其他功能相比,似乎是一个别的职责。模型是否应该拥有此职责!
呢?

放在模型中的影响:

因为draw是依赖于设备和底层图形的接口的。如果draw在模型中,那么模型的这个层(layer),就需要依赖一个显示绘画层。
这显然是不好的设计:

  • 我们希望模型层只是模型,数据. 做unit test时候,基本不需要对模型层进行cover, 因为里面只有数据。
    但是现在因为有了画的逻辑存在, model层就需要unit test 覆盖。
  • 当application层需要做unit test时候,需要new model,此时也是非常麻烦的,我们还要构造显示层。

更大的弊端

在业务中,draw除了对显示层有依赖,也可能对其他的Model有依赖。比如金箍棒model和孙悟空Model。 对于金箍棒,它在draw的时候, 还需要知道孙悟空手的位置已经方向。
对于这种情形,可能的一个解决办法是,让金箍棒模型对孙悟空模型产生依赖。这种弊端非常明显,使得模型层依赖混乱。理想的模型层里面的模型,应该是相互独立的,没有相互依赖。

separate responsibility

iteration1:
将draw的职责从模型中分离出来。模型之间相互没影响。
好处:

  • 模型对显示层没有了依赖,模型只负责模型,没有其他职责
  • 模型的draw 功能分离了

**iteration 2: **
刚才我们还提到,在draw的时候,一个模型可能对别的模型有依赖,因此我们可以做一个非常thin layer ,单独为了draw. 这个layer比模型稍微高些。

标签:draw,场景,职责,依赖,模型,MVC,设计模式,unit
From: https://www.cnblogs.com/tortelee/p/18391138

相关文章

  • Vue面试常见知识总结2——spa、vue按需加载、mvc与mvvm、vue的生命周期、Vue2与Vue3区
    SPASPA(SinglePageApplication,单页面应用)是一种Web应用程序架构,其核心特点是在用户与应用程序交互时,不重新加载整个页面,而是通过异步加载页面的局部内容或使用JavaScript动态更新页面。以下是对SPA的详细解析,包括其优点和缺点:SPA的优点更好的用户体验:SPA无需重新加载......
  • MVCC详解
    1.概念1.1什么是MVCCMVCC,全称Multi-VersionConcurrencyControl,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。MVCC在MySQLInnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-......
  • 设计模式之模板模式和策略模式-----------超级超级详细!超级全面!
    1.模板模式的定义一个抽象类,公开定义了执行自己的方法/模板。它的子类可以按需重写方法实现,但调用需要按照抽象类中的定义的方式/模板进行。这种类型的设计模式属于行为性模式之一。用于定义一个操作中的算法的框架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个......
  • 点云库使用场景以及编译和使用实例
    1点云库概述与应用场景##什么是点云库?点云库是一套专门用于处理三维点云数据的软件工具和算法集合。点云是由大量的三维坐标点组成的数据集,通常用来表示物体或环境的表面。最知名的点云库是开源的PCL(PointCloudLibrary),但还有其他库如Open3D,PDAL(PointDataAbstracti......
  • Java设计模式之单例模式(Singleton)
    单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。这样的模式有几个好处:某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。省去了new操作符,降低了系统内存的使用频率,减轻GC压力。有些类如交易所的核心交易引擎......
  • 设计模式之迭代器模式
    迭代器模式很多人都熟悉,但是什么是迭代器,为什么要用迭代器?这个很多人就很难做出具体回答了,只是知道如果有了迭代器,那么我们就能foreach遍历了,方便循环处理。这只是对迭代器的用途,进行了回答,foreach语法是java1.5时加入的语法糖,那么在这之前呢,之前是怎么做的?要知道并不是所有容器都......
  • (大三上_游戏开发设计模式_上课_1)多态练习_计算机
    灵活性,可扩展,灵活性,可维护封装继承:要有基类代码片段写整个属性    基类里面 基态      基方向,虚方法//虚方法,可以写在实例方法里 publicvirtualdoubleGetResult() {  return0;}实例方法,可以创建实例抽象方法,要写在抽......
  • Nginx 中的反向代理和负载均衡不是完全相同的概念,但它们经常一起使用,并且在某些场景下
    反向代理(ReverseProxy)反向代理指的是代理服务器接收来自客户端的请求,并将这些请求转发给实际提供服务的服务器。客户端并不直接与实际的服务器通信,而是通过反向代理服务器来完成请求和响应的传递。反向代理的主要用途包括:缓存静态内容以减少后端服务器的负载。提供额外的安全层,隐......
  • 一种基于YOLOv10的高精度光伏板缺陷检测算法(原创自研),适用缺陷检测场景、小缺陷场景
     ......
  • 设计模式 -- 代理模式(Proxy Pattern)
    基本介绍代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象代理模式有不......