首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

OO设计 - 对象向类间询问间接持有它的问题

OO设计(Object-Oriented Design)是一种软件设计方法,它以对象为中心,通过将系统划分为一组相互协作的对象来解决问题。对象是具有状态(属性)和行为(方法)的实体,它们通过消息传递进行通信和交互。

对象向类间询问间接持有它的问题是指在OO设计中,一个对象需要获取另一个对象的信息或调用其方法,但直接持有该对象可能会导致耦合性增加。为了降低耦合性,可以通过对象向类间询问的方式来间接持有该对象。

具体来说,对象向类间询问间接持有它的问题可以通过以下步骤解决:

  1. 定义一个接口或抽象类:创建一个接口或抽象类,定义需要获取信息或调用方法的操作。
  2. 实现接口或继承抽象类:在需要被询问的类中实现接口或继承抽象类,并实现相应的方法。
  3. 通过依赖注入方式传递对象:在需要获取信息或调用方法的类中,通过依赖注入的方式将实现了接口或继承了抽象类的对象传递进来。
  4. 调用对象的方法或获取信息:通过调用传递进来的对象的方法或获取其信息,实现对该对象的间接持有。

对象向类间询问间接持有的优势包括:

  1. 降低耦合性:通过依赖注入的方式,对象之间的耦合性降低,使得系统更加灵活、可扩展和易于维护。
  2. 提高代码复用性:通过定义接口或抽象类,可以实现代码的复用,不同的类可以共享相同的接口或抽象类。
  3. 支持单元测试:通过依赖注入的方式,可以方便地进行单元测试,因为可以通过传递模拟对象来测试特定的行为或信息。

对象向类间询问间接持有的应用场景包括:

  1. 依赖注入框架:许多现代的开发框架都支持依赖注入,通过依赖注入的方式实现对象之间的间接持有,提高系统的灵活性和可测试性。
  2. 插件系统:在插件系统中,插件可以通过接口或抽象类定义自己的功能,并通过依赖注入的方式将其注册到主程序中,实现插件与主程序的解耦。
  3. 观察者模式:观察者模式中,观察者对象通过接口或抽象类定义自己的更新方法,并通过依赖注入的方式将其注册到被观察者对象中,实现观察者与被观察者的解耦。

腾讯云相关产品和产品介绍链接地址:

  1. 云函数(Serverless):腾讯云云函数是一种事件驱动的无服务器计算服务,可以帮助开发者在云端运行代码,无需关心服务器管理和运维。详情请参考:https://cloud.tencent.com/product/scf
  2. 云数据库 MySQL 版:腾讯云数据库 MySQL 版是一种高性能、可扩展的关系型数据库服务,提供了稳定可靠的数据存储和访问能力。详情请参考:https://cloud.tencent.com/product/cdb_mysql
  3. 云原生容器服务(TKE):腾讯云原生容器服务(TKE)是一种高度可扩展的容器管理服务,支持容器化应用的部署、运行和管理。详情请参考:https://cloud.tencent.com/product/tke
  4. 云安全中心:腾讯云安全中心是一种集合了安全态势感知、漏洞扫描、安全合规等功能的综合安全管理平台。详情请参考:https://cloud.tencent.com/product/ssc

请注意,以上仅为腾讯云相关产品的示例,其他云计算品牌商也提供类似的产品和服务。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

GRASP设计模式 原

OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当粒度归纳出相关;然后定义各个之间关联关系,并给这些分配相应职责,同时定义这些之间协作方式。...给出了在给分配职责过程中,设计者们所需要遵从一些原则或者指导性建议     GRASP不是平时说GoF(Gang of Four)23种设计模式。...GRASP设计模式描述是在OO设计中为互相协作分配职责原则或者建议,而GoF设计模式则是在更高层次上描述一个OO系统或者其局部系统行为以及结构上抽象。...GRASP与GoF最大区别是描述是互相协作多个职责分配原则或者建议。     ...定义了9个基本OO设计原则或基本设计构件。

95920

软件设计之——“高内聚低耦合”

耦合强弱取决与模块间接复杂性、调用模块方式以及通过界面传送数据多少。 模块耦合度是指模块之间依赖关系,包括控制关系、调用关系、数据传递关系。...耦合强度依赖于以下几个因素: (1)一个模块对另一个模块调用; (2)一个模块另一个模块传递数据量; (3)一个模块施加到另一个模块控制多少; (4)模块之间接复杂程度。...内聚: 故名思议,表示内部聚集、关联长度,那么高内聚就是指要高度聚集和关联。 高内聚:之间关系而定,高,意思是他们之间关系要简单,明了,不要有很强关系,不然,运行起来就会出问题。...这是软件工程中概念,是判断设计好坏标准,主要是面向OO设计,主要是看内聚性是否高,偶合度是否低 “高内聚,低耦合”,首先要知道一个软件是由多个子程序组装而成, 而一个程序由多个模块(方法)...内聚是一个中变量与方法连接强度尺度.高内聚是值得要,因为它意味着可以更好地执行一项工作.低内聚是不好,因为表明元素之间很少相关.成分之间相互有关联模块是合乎要求.每个方法也应该高内聚

67920
  • “高内聚低耦合”软件设计建议收藏

    耦合度(Coupling)是对模块关联程度度量。耦合强弱取决与模块间接复杂性、调用模块方式以及通过界面传送数据多少。...耦合强度依赖于以下几个因素: (1)一个模块对另一个模块调用; (2)一个模块另一个模块传递数据量; (3)一个模块施加到另一个模块控制多少; (4)模块之间接复杂程度。...内聚: 故名思议,表示内部聚集、关联长度,那么高内聚就是指要高度聚集和关联。 高内聚:之间关系而定,高,意思是他们之间关系要简单,明了,不要有很强关系,不然,运行起来就会出问题。...这是软件工程中概念,是判断设计好坏标准,主要是面向OO设计,主要是看内聚性是否高,偶合度是否低 “高内聚,低耦合”,首先要知道一个软件是由多个子程序组装而成, 而一个程序由多个模块(方法)构成...内聚是一个中变量与方法连接强度尺度.高内聚是值得要,因为它意味着可以更好地执行一项工作.低内聚是不好,因为表明元素之间很少相关.成分之间相互有关联模块是合乎要求.每个方法也应该高内聚

    78910

    设计模式之工厂模式(三)

    ,就是在依赖具体。...事实上,有一个OO设计原则就正式阐明了这一点;这个原则甚至还有一个又响亮又正式名称:“依赖倒置原则”。要依赖抽象,不要依赖具体。...PizzaStore依赖这些具体披萨。 原则应用 非常依赖披萨店主要问题在于:依赖每个披萨类型。因为它是在自己orderPizza()方法中,实例化这些具体类型。...想要遵循依赖倒置原则,工厂方法并非是唯一技巧,但却是最有威力技巧之一了。 依赖倒置,究竟倒置在哪里? 在依赖倒置原则中倒置指的是和一般OO设计思考方式相反。...但是,也需要避免在OO设计中违反依赖倒置原则: 变量不可以持有具体引用:如果使用new,就会持有具体引用。

    32510

    面向对象和函数式编程本质区别

    编程本质 当写过许许多多程序后,接触了那么多编程模式、设计模式、框架、语言、算法、数据结构以后,就会发现编程本质万变不离其宗就是,操纵一坨数据。...从中我们可以看出一些东西,OO是通过持有,以及传递对象方式去让别的对象来操作数据,而对象也会是其他对象成员,层层嵌套。当你想要访问某一个数据时候,就需要顺着对象引用链条去找,一步步去操作。...其实在C#中对lambda表达式编译就是这个原理。会内部创建一些。 当然高阶函数写法肯定不会这么啰嗦,会写比较优雅。...Javascript超越了函数式以及OO 在JS中约束进一步被打破,JS中可以修改函数“作用域”,成员方法可以以另一个对象为作用域。JS还可以更换父,这在其他OO语言是难以想象和不可理喻。...所以Javascript可以用最简短代码来代替OO许多代码,究其本质,就是OO需要不断传递、持有不同作用域——对象。而Javascript只需要处在作用域链内,即可轻易访问到所需要数据。

    1.2K30

    Android 中常见内存泄漏

    我们经常会在不经意写出造成内存泄漏代码,往往在代码上很难查出来。...1.3 内部类 我们知道,非静态内部类持有外部类一个引用。因此,如果我们在一个外部类中定义一个静态变量,这个静态变量是引用内部类对象。将会导致内存泄漏!因为这相当于间接导致静态引用外部类。...而每个Message对象持有Handler引用(Message对象target属性持有Handler引用),从而导致Message间接引用到了Activity。...1.6 Threads和TimerTask Threads和Timer导致内存泄漏原因跟内部类一样。虽然在新线程中创建匿名,但是只要是匿名/内部类,都会持有外部类引用。...这是典型享元模式(不熟悉同学参考《从Android代码中来记忆23种设计模式 》)。我们可以通过使用对象池来实现.

    80780

    设计模式(十四)中介者模式

    如果在买房过程中出现纠纷问题,则很难进行解决。就如下图所示一样。 ?...在中介者模式中有如下角色: Mediator:抽象中介者角色,定义了同事对象到中介者对象接口。 ConcreteMediator:具体中介者角色,它从具体同事对象接收消息,具体同事发出命令。...notice方法用于门派发送通知,其中United为抽象同事也就是门派,接下来我们来创建。 抽象同事角色 ? 门派(抽象同事)会在构造方法中得到武林联盟(抽象中介者)。...这里写图片描述 中介者模式优缺点和使用场景 优点 符合迪米特原则,将原有的一对多依赖变成了一对一依赖,降低耦合。...代理模式和中介者模式 代理模式是结构型设计模式,它有很多种类型,主要是在访问对象时引入一定程度间接性,由于有间接性,就可以附加多种用途,比如进行权限控制。中介者模式则是为了减少对象之间相互耦合。

    60650

    OOP三大特性之封装

    如何理解封装 OO是解决更大规模应用开发一种尝试,提升了程序员管理程序尺度。...正确做法: 设计一个,先考虑对象应提供哪些行为 然后,根据这些行为提供对应方法 最后考虑实现这些方法要有哪些字段 所以连接二者是方法,其命名就是个大学问了,应体现你意图,而非具体怎么做。...一些人上手就来: 但推荐写法是表达你意图: 两段代码只是修改密码方法名不同,但更重要差异是: 一个在说做什么 一个在说怎么做 将意图与实现分离,优秀设计须考虑问题。...关于setter: 大概率是你用错名字,应该用一个表达意图名字 setter通常意味着修改,这是不推荐 可变对象会带来很多问题,后续再深入讨论。所以,设计中更好做法是设计不变。...设计角度,必须谨慎自省:这个方法有必要暴露吗? 其实可仅暴露一个方法: 外部调用代码也会简化: 尽可能减少接口暴露,该原则适于设计、系统设计

    49520

    ECS初探

    这些信息量并不算大,所以上面提到问题也就不存在了。 ---- 下面开始进入正题。 关于ECS,我大概花了一周时来学习理论知识。...在看完《守望先锋》架构设计和网络同步之后, 我接着看了一下Wiki。 Wiki给了一个渲染方面的例子: “一个“系统”,遍历所有具有物理和可见组件实体,并绘制它们。...但是,历史经验告诉我OO在非UI领域一点也不好用,以致于他们要出各种设计模式来解决OO带来坑。 不管怎么样,即然大家都在吹ECS,肯定是有过人之处。...如果按照OO思路,hero往往会持有buff,hurt,heal,skill等实例,但是由于这几个系统往往需要相互读取对方部分数据,以至于buff,hero,heal,skill中往往还会持有一个...不但不能解耦合,还会让问题更糟糕。

    8.5K20

    Go设计模式--中介者,最后模式!

    今天继续学习设计模式,也是我们要学习最后一个设计模式—中介者模式,对这个模式有一点了解后会觉得跟我们已经学过观察者模式挺像,但是两者还是有些区别的,使用场景也不一样,具体我们放在最后再讲,先来一起学习中介者模式...中介者模式构成 中介者模式结构构成可以用下面的UML图来表示 图中各个构成跟我们上面代码实例中列举十分似,Component 实现里需要持有指向中介者引用,中介者里也保有对各个组件对象引用...中介模式与观察者模式区别 中介模式与观察者模式在结构上有些相似,观察者模式中EventDispatcher 和 中介模式中 Mediator 看起来很想,都是把多个组件之间关系,维护到自身,实现组件间接通信达到解构效果...,不过这两个设计模式在使用场景或者叫要解决问题上,还是有些差别 观察者模式 组件沟通是单向,从被观察(发送事件实体)到观察者(监听器),一个参与者要么是观察者要么是被观察者,不会同时兼具两种身份...中介者模式优点 减少依赖,将多对多依赖转化成一对多,降低了耦合。 各司其职,符合迪米特法则。

    16130

    Java高并发之锁优化

    代码中运用了很多volatile声明共享变量, 第一时获取修改内容, 性能较好....一个典型示例便是LinkedBlockingQueue,在内部, take和put操作本身是隔离,  有若干个元素时候, 一个在queue头部操作, 一个在queue尾部操作, 因此分别持有一把独立锁...JDK中各种涉及锁优化并发可以看之前博文: 并发包总结 ThreadLocal 除了控制有限资源访问外, 我们还可以增加资源来保证对象线程安全....如果在使用结束后, 没有手动释放ThreadLocal, 由于线程会被重复使用, 那么会出现之前线程对象残留问题, 造成内存泄露, 甚至业务逻辑紊乱....无锁 与锁相比, 使用CAS操作, 由于其非阻塞性, 因此不存在死锁问题, 同时线程之间相互影响,  也远小于锁方式. 使用无锁方案, 可以减少锁竞争以及线程频繁调度带来系统开销.

    69940

    Java高并发情况下锁机制优化

    代码中运用了很多volatile声明共享变量, 第一时获取修改内容, 性能较好....一个典型示例便是LinkedBlockingQueue,在内部, take和put操作本身是隔离, 有若干个元素时候, 一个在queue头部操作, 一个在queue尾部操作, 因此分别持有一把独立锁...JDK中各种涉及锁优化并发可以看之前博文: 并发包总结 ThreadLocal 除了控制有限资源访问外, 我们还可以增加资源来保证对象线程安全....如果在使用结束后, 没有手动释放ThreadLocal, 由于线程会被重复使用, 那么会出现之前线程对象残留问题, 造成内存泄露, 甚至业务逻辑紊乱....无锁 与锁相比, 使用CAS操作, 由于其非阻塞性, 因此不存在死锁问题, 同时线程之间相互影响, 也远小于锁方式. 使用无锁方案, 可以减少锁竞争以及线程频繁调度带来系统开销.

    1K10

    【JavaScript】 JS面向对象模式与实践

    这是在面向对象中无法让人接受 所以,一般来说,我们不能把数组或纯对象数据放到原型中 对原型模式评价 评价:原型模式是不完善OO模式, 所以整体上看,无法独立地完成面向对象设计各种工作,而需要和构造函数模式配合使用...实际上,我们可以把面向对象看作一种设计模式(OO), 而把原型所体现设计模式归结为另外一种设计模式(OLOO)。...OO设计模式 OO,也即面向对象, 在世界里, 有一个父和一堆子类, 父是定义通用行为, 而子类在父基础上定义更为细化行为。...而原型,就是一个来自于OLOO世界而进入OO世界的人物 对原型恰当认知方式 原型一直以来难以让人理解原因是, 我们竭尽全力想要把纳入JS面向对象设计一部分,但是又不得不面对它在使用中诸多不满足面向对象要求表现..., 例如我上面提到创建对象和继承中存在问题

    1.1K60

    JAVA面试50讲之9:动态代理原理是什么?

    一、代理模式 代理模式是常用java设计模式,他特征是代理与委托有同样接口,代理主要负责为委托预处理消息、过滤消息、把消息转发给委托,以及事后处理消息等。...简单说就是,我们在访问实际对象时,是通过代理对象来访问,代理模式就是在访问实际对象时引入一定程度间接性,因为这种间接性,可以附加多种用途。在后面我会 解释这种间接性带来好处。...上面说到,代理模式就是在访问实际对象时引入一定程度间接性,因为这种间接性,可以附加多种用途。这里间接性就是指不直接调用实际对象方法,那么我们在代理过程中就可以加上一些其他用途。...四、动态代理原理分析 1、Java动态代理创建出来动态代理 上面我们利用ProxynewProxyInstance方法创建了一个动态代理对象,查看该方法源码,发现只是封装了创建动态代理步骤...代理调用自己方法时,通过自身持有的中介对象来调用中介对象invoke方法,从而达到代理执行被代理对象方法。也就是说,动态代理通过中介实现了具体代理功能。

    62120

    DDD聚合设计困境

    很多人认为只是个理论。 最近又看了一遍《IDDD》第十章聚合,结合已有的理论知识,来反思下这个问题。 DDD聚合是什么? 最容易与DDD聚合混淆就是OO聚合关系。...一个问题与很多回答构成一个完整问答关系。 在OO中还有一种比聚合关系更强关联关系: 组合关系(Composition)也表示之间整体和部分关系,但是组合关系中部分和整体具有统一生存周期。...设计小聚合 一个完整聚合 如果要加载一个完整聚合,需要把所有这些实体与值对象都加载出来。那系统性能和可伸缩性大受影响。 为了解决这些问题,所有提出要设计小聚合。...这些问题怎么解决? 当前能想到解决方案似乎只有在《DDD对象生命周期管理》[2]提到关联对象模式。 总结 聚合设计时,尽量使用小聚合。这对吗?解决设计困境了吗? 如果使用小聚合,会造成一种现象。...会出现很多service。 只有使用service,才能在聚合跨越对象生命周期,维持一致性。 这会慢慢演化成贫血模型,因为一部分逻辑在对象中,另一部分会放到service中。

    78030

    java动态代理实现与原理详细分析

    一、代理模式 代理模式是常用java设计模式,他特征是代理与委托有同样接口,代理主要负责为委托预处理消息、过滤消息、把消息转发给委托,以及事后处理消息等。...简单说就是,我们在访问实际对象时,是通过代理对象来访问,代理模式就是在访问实际对象时引入一定程度间接性,因为这种间接性,可以附加多种用途。在后面我会 解释这种间接性带来好处。...上面说到,代理模式就是在访问实际对象时引入一定程度间接性,因为这种间接性,可以附加多种用途。这里间接性就是指不直接调用实际对象方法,那么我们在代理过程中就可以加上一些其他用途。...四、动态代理原理分析     1、Java动态代理创建出来动态代理 上面我们利用ProxynewProxyInstance方法创建了一个动态代理对象,查看该方法源码,发现只是封装了创建动态代理步骤...代理调用自己方法时,通过自身持有的中介对象来调用中介对象invoke方法,从而达到代理执行被代理对象方法。也就是说,动态代理通过中介实现了具体代理功能。

    31710

    Android开发笔记(五十一)通过Messenger实现进程通信

    另外,进程通信不局限于两个APP进程直接通信,也包括APP与系统进程通信,以及进程通过文件、广播等手段间接通信。 开启多进程 APP开启多进程需要同时修改配置和代码。...该方式创建了一个持有当前进程实例本地信使,本地信使会收到并处理消息。 Messenger(IBinder target) : 构造函数,传入对方进程IBinder对象。...该方式创建了一个持有对方进程实例远程信使,远程信使只能对方进程发送消息。 send : 发送消息。用于客户端服务端发送请求消息,以及服务端客户端发送应答消息。...(数据处理) IBinder 下面这段介绍翻译自Android开发文档:IBinder是远程对象基本接口,是为高性能而设计轻量级远程调用机制核心部分。...第一个方法使你可以远端IBinder对象发送请求,第二个方法使你自己远程对象能够接收响应。

    82610

    设计模式 (四)——简单工厂模式(Simple Factory,创建型)

    简单工厂模式,由一个工厂对象决定创建出哪一种产品类实例,经常被用于封装创建对象代码。...简单工厂创建产品方法可以被外界直接调用来创建所需产品对象。 IProduct:抽象产品类,简单工厂模式创建所有对象负责描述所有实例所共有的公共函数接口。...(2)客户只知道传入工厂参数,对于如何创建对象(逻辑)不关心。 优点: 使用户根据参数获得对应实例,避免了直接实例化,降低用户代码与目标耦合性。...简单工厂需要知道所有要生成类型,当子类过多或者子类层次过多时不适合使用。 4.小节 (1)简单工厂模式满足了OO设计原则:为交互对象之间松耦合设计而努力。...(2)简单工厂模式,由一个工厂对象决定创建出哪一种产品类实例,经常被用于封装创建对象代码。 ---- 参考 [1]设计模式(四)简单工厂模式 [2]Freeman E.,Freeman E.

    29730

    2023跟我学设计模式:中介者模式(Intermediary)

    问题 假如你有一个创建和修改客户资料对话框, 由各种控件组成, 例如文本框 (Text­Field)、 复选框和按钮 等。 用户界面中各元素关系会随程序发展而变得混乱。...这些组件必须调用特殊中介者对象, 通过中介者对象重定向调用行为, 以间接方式进行合作。 最终, 组件仅依赖于一个中介者, 无需与多个其他组件相耦合。...在资料编辑表单例子中, 对话框 (Dialog) 本身将作为中介者, 其很可能已知自己所有的子元素, 因此你甚至无需在该类中引入新依赖关系。 UI 元素必须通过中介者对象进行间接沟通。...采用这种方式, 中介者模式让你能在单个中介者对象中封装多个对象复杂关系网。 所拥有的依赖关系越少, 就越易于修改、 扩展或复用。...Go 中介者模式讲解和代码示例 中介者是一种行为设计模式, 让程序组件通过特殊中介者对象进行间接沟通, 达到减少组件之间依赖关系目的。

    22320

    设计模式之状态模式(三)

    ; State soldState; // 这是新加状态 State winnerState; 然后,我们去实现WinnerState本身,和SoldState很像:...} public void dispense() { System.out.println("No gumball dispensed"); } } 剩下就是如何客户展示问题了...设计箱内工具 万年不变总结时间来啦 OO基础 抽象、封装、继承、多态 OO原则(本章没有新设计原则出现哦) 封装变化 多用组合,少用继承 针对接口编程,不针对实现编程 为交互对象之间松耦合设计而努力...依赖抽象,不要依赖具体 应该对扩展开放,对修改关闭 只和朋友交谈 别找我,我会找你 应该只有一个改变理由 OO模式 『策略模式』、『观察者模式』、『装饰者模式』、『抽象工厂模式』、『工厂方法模式...』、『单例模式』、『命令模式』、『适配器模式』、『外观模式』、『模板方法模式』、『迭代器模式』、『组合模式』 『状态模式』允许对象在内部状态改变时改变行为,对象看起来好像修改了

    21610
    领券