GoF23-合成复用原则

2024-03-29 02:38
文章标签 复用 合成 原则 gof23

本文主要是介绍GoF23-合成复用原则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

合成复用原则(Composite Reuse Principle)
合成复用原则(Composite Reuse Principle)原则是尽量使用合成/聚合的方式,而不是使用继承
场景描述
	假设现在有A类,A类中有method1()、method2(),B类想要去使用A类中的method1(),按照我们平时的想法就是让B类去继承A类,进而去调用A类中的method1()但是使用继承的方式会让A类和B类具有较高的耦合性
改进方案
方案一:B类去依赖A类。B类中编写一个方法,其方法的形参为A类的对象,进而B类中就可以使用A类中的方法了方案二:A类聚合B类。B类中创建一个成员变量:A类对象,在B类中便可以使用setA(A a)去将A类对象传递到B类中来,因此在B类中便可以调用A类方法了方案三:B类组合A类。B类中创建一个成员变量:A类对象,并且在创建成员变量的时候就进行赋值操作,赋值:new A(),因此在B类中便可以调用A类方法了
代码实现
package com.tan.principle.composite_reuse;/*
需求:
假设现在有A类,A类中有method1()、method2(),B类想要去使用A类中的method1()传统写法*/
public class CompositeReuse {public static void main(String[] args) {B b = new B();b.method1();}
}class A {public void method1(){System.out.println("俺是A类中的method1");}public void method2(){System.out.println("俺是A类中的method2");}
}class B extends A {}
package com.tan.principle.composite_reuse.improve1;/*
需求:
假设现在有A类,A类中有method1()、method2(),B类想要去使用A类中的method1()方案一*/
public class CompositeReuse {public static void main(String[] args) {A a = new A();B b = new B();b.useA(a);}
}class A {public void method1(){System.out.println("俺是A类中的method1");}public void method2(){System.out.println("俺是A类中的method2");}
}class B {public void useA(A a){a.method1();}}
package com.tan.principle.composite_reuse.improve2;/*
需求:
假设现在有A类,A类中有method1()、method2(),B类想要去使用A类中的method1()方案二*/
public class CompositeReuse {public static void main(String[] args) {A a = new A();B b = new B();b.setA(a);b.a.method1();}
}class A {public void method1(){System.out.println("俺是A类中的method1");}public void method2(){System.out.println("俺是A类中的method2");}
}class B {public A a;public void setA(A a){this.a = a;}
}
package com.tan.principle.composite_reuse.improve3;/*
需求:
假设现在有A类,A类中有method1()、method2(),B类想要去使用A类中的method1()方案三*/
public class CompositeReuse {public static void main(String[] args) {A a = new A();B b = new B();b.a.method1();}
}class A {public void method1(){System.out.println("俺是A类中的method1");}public void method2(){System.out.println("俺是A类中的method2");}
}class B {public A a = new A();
}
设计原则核心思想
设计原则核心思想:
1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起2.针对接口编程,而不是针对实现编程3.为了交互对象之间的解耦合设计而努力

这篇关于GoF23-合成复用原则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/857384

相关文章

JVM内存调优原则及几种JVM内存调优方法

JVM内存调优原则及几种JVM内存调优方法 1、堆大小设置。 2、回收器选择。   1、在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。   2、对JVM内存的系统级的调优主要的目的是减少

水处理过滤器运行特性及选择原则浅谈

过滤属于流体的净化过程中不可缺的处理环节,主要用于去除流体中的颗粒物或其他悬浮物。水处理过滤器的原理是利用有孔介质,从流体中去除污染物,使流体达到所需的洁净度水平。         水处理过滤器的滤壁是有一定厚度的,也就是说过滤器材具有深度,以“弯曲通 道”的形式对去除污染物起到了辅助作用。过滤器是除去液体中少量固体颗粒的设备,当流体进入置有一定规格滤网的滤筒后,其杂质被阻挡,而

unity导入半透明webm + AE合成半透明视频

有些webm的文件导入unity后无法正常播报,踩坑好久才知道需要webm中的:VP8 标准 现在手上有几条mp4双通道的视频,当然unity中有插件是可以支持这种视频的,为了省事和代码洁癖,毅然决然要webm走到黑。 mp4导入AE合成半透明 打开 AE 软件,创建一个新的合成项目。在项目面板中,选择 “导入” 或直接将 MP4 视频文件拖放到项目面板中,导入视频素材。项目面板中,右击

三文带你轻松上手鸿蒙的AI语音03-文本合成声音

三文带你轻松上手鸿蒙的AI语音03-文本合成声音 前言 接上文 三文带你轻松上手鸿蒙的AI语音02-声音文件转文本 HarmonyOS NEXT 提供的AI 文本合并语音功能,可以将一段不超过10000字符的文本合成为语音并进行播报。 场景举例 手机在无网状态下,系统应用无障碍(屏幕朗读)接入文本转语音能力,为视障人士提供播报能力。类似微信读书,可以实现将文章内容通过语音朗读,可以

《设计模式:可复用面向对象软件的基础》读书笔记(3)

这篇博客记录了书中《第3章:创建型模式》里的要点。 介绍 创建型设计模式抽象了实例化过程。 在这些模式中有两个不断出现的主旋律: 他们都将关于该系统使用哪些具体的类的信息封装起来。他们隐藏了这些类的实例是如何被创建和放在一起的。 整个系统关于这些对象所知道的是由抽象类所定义的接口。因此,创建型模式在什么被创建、谁创建它、它是怎样被创建的,以及何时被创建等方面给予你很大的灵活性。 下面将这

【设计模式】哪些模式可以提高代码的可维护性和复用性?

可维护性 MVC模式 (Model-View-Controller):将应用程序分为三个部分,分别是模型(Model)、视图(View)和控制器(Controller),它们之间通过定义清晰的接口进行交互。这种模式可以将业务逻辑与用户界面分离,使得应用程序更容易维护和优化。 观察者模式 (Observer):将对象之间的一对多的依赖关系封装起来,当一个对象发生改变时,它的所有依赖者都会得到通

多行命令提示符中的命令合成一行

C:\Windows\System32\cmd & cd C:\Siemens\Teamcenter12\tc_menu & C:\Siemens\Teamcenter12\tc_menu\tcdb_config1.bat & C:\Users\Administrator\Desktop\ITK\TEST1\x64\Debug\TEST1.exe 用&分割 C:\Windows\System3

震惊,从仿真走向现实,3D Map最大提升超12,Cube R-CNN使用合成数据集迁移到真实数据集

震惊,从仿真走向现实,3D Map最大提升超12,Cube R-CNN使用合成数据集迁移到真实数据集 Abstract 由于摄像机视角多变和场景条件不可预测,在动态路边场景中从单目图像中准确检测三维物体仍然是一个具有挑战性的问题。本文介绍了一种两阶段的训练策略来应对这些挑战。我们的方法首先在大规模合成数据集RoadSense3D上训练模型,该数据集提供了多样化的场景以实现稳健的特征学习。随后,

OkHttp3源码分析[复用连接池]

OkHttp系列文章如下 OkHttp3源码分析[综述]OkHttp3源码分析[复用连接池]OkHttp3源码分析[缓存策略]OkHttp3源码分析[DiskLruCache]OkHttp3源码分析[任务队列] 1. 概述 HTTP中的keepalive连接在网络性能优化中,对于延迟降低与速度提升的有非常重要的作用。 通常我们进行http连接时,首先进行tcp握手,然后传输数据,最后释

重写equals和hashCode的原则规范

当符合以下条件时不需要重写equals方法:     1.     一个类的每一个实例本质上都是唯一的。     2.     不关心一个类是否提供了“逻辑相等”的测试功能     3.     超类已经改写了equals方法,并且从超类继承过来的行为对于子类也是合适的。     4.     一个类时私有的或者是package私有的,并且可以确定它的equals方法永远不会被调用。(这