合成/聚合原则: 桥接模式

假想场景:hp和apple是全球知名的电脑生产厂家,起初他们各自的电脑操作系统分别是linux和macintosh,microsoft是软件行业的龙头。为了吸引更多客户购买电脑,hp和apple请ms为他们开发两款最常用的软件,办公软件和及时通讯工具。ms结了订单后,分别为hp和apple开发了office和msn。随着微软windows操作系统的大面积普及,hp的linux和apple的mac使用的人越来越少。最后hp和apple不得不在自己的硬件平台上也支持windows操作系统,同样,他们不得不请ms帮助开发windows上的office和msn。这样,为了兼容三种操作系统,ms开发出了三种对应的office和msn。随着微软.net技术的普遍应用,hp和apple又不得不请ms为他们在windows平台上开发visual studio来提升对开发人员的吸引力。
上面的场景和“简单工厂、工厂方法和抽象工厂模式”那一篇非常相似,不同的地方是电脑多了一种操作系统,软件也相应的多了一种。这里我们可以抽象出另外一种设计模式:桥接模式,即将抽象部分和实现部分分离,使他们可以独立地变化。什么叫“抽象部分和实现部分分离”呢?就假想场景而言,就是让电脑既可以按照操作系统来分类,也可以按照应用软件功能来分类(操作系统是特殊的软件,这里把它单独当作区分电脑的一种分类方式)。更通俗的理解就是“实现系统可能又多种角度分类,每一种分类都可能变化,把这种多角度分离出来让他们独立变化,减少他们之间的耦合”。Code is cheap。看代码了:
ContractedBlock.gifExpandedBlockStart.gifCode
using System;

/* 按照软件功能分类 */
/// <summary>
/// 应用程序抽象类
/// </summary>
abstract class Application
{
    
public abstract void Run();
}

/*office,msn,vs具体类*/
class Office : Application
{
    
public override void Run()
    {
        Console.Write(
"Run Office");
    }
}
class Msn : Application
{
    
public override void Run()
    {
        Console.Write(
"Run Msn");
    }
}
class VisualStudio : Application
{
    
public override void Run()
    {
        Console.Write(
"Run VS");
    }
}

/* 按照操作系统分类 */

abstract class Os
{
    
protected Application software;
    
public void SetApplication(Application app)//电脑需要安装应用程序
    {
        
this.software = app;
    }
    
public abstract void Run(); //电脑运行
}

/*windows,linuxs,mac具体类*/
class MsWindows : Os
{
    
public override void Run()
    {
        software.Run();
    }
}
class HpLinux : Os
{
    
public override void Run()
    {
        software.Run();
    }
}
class AppleMac : Os
{
    
public override void Run()
    {
        software.Run();
    }

/// <summary>
/// 客户端调用
/// </summary>
    static void Main(string[] args)
    {
        Os myOs;
        myOs 
= new MsWindows();
        myOs.SetApplication(
new Office()); //安装office
        myOs.Run();
        myOs.SetApplication(
new Msn()); //安装msn
        myOs.Run();
        myOs.SetApplication(
new VisualStudio()); //安装vs
        myOs.Run();

        Console.Read();
    }
}
上面的代码是一种松耦合的程序,它遵循了合成/聚合复用原则。所谓合成,是一种强的“拥有”关系,体现了严格的整体与部分的关系,部分和整体的生命周期一样;所谓聚合,是一种弱的“拥有”关系,体现的是a对象可以包含b对象,但b对象不是a对象的一部分。举例来说,翅膀和大雁是部分与整体的关系,且它们的生命周期相同,是合成关系;而大雁和雁群是聚合关系,因为每只大雁都是属于一个雁群,一个雁群可以又多只大雁。相应的,我们的代码部分,应用程序application和操作系统os就是聚合关系。
合成/聚合复用原则的好处是:”有助于保持每个类被封装,并被集中在单个任务中,这样类和类的继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。“

转载于:https://www.cnblogs.com/jeffwongishandsome/archive/2009/04/13/1411737.html

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

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

相关文章

java查看jdk源码_Java-如何查看JDK源码

一、引言学习Java和使用Java的小伙伴都必须要看的懂Java的开发文档&#xff0c;然而&#xff0c;开发文档只是开发者对Java代码的功能做出简略的说明&#xff0c;它只是告诉你这个类能干嘛&#xff0c;并没告诉你这个类怎么干&#xff0c;所以&#xff0c;阅读Java源码是每个开…

arrays中copyof复制两个数组_数据结构与算法(3)数组

前言数组(Array)是一种线性表数据结构&#xff0c;利用一组连续的内存空间&#xff0c;存储一组具有相同类型的数据。概念介绍首先我们说一下什么是线性表&#xff0c;线性表就是数据排成一条线的数据结构&#xff0c;每个线性表最多只有前和后两个方向&#xff0c;数组、链表、…

java做的一个将中文转换成Unicode码的工具类【转载】做个标记,明天研究下

这两天在使用RBManager&#xff08;一个开源工具&#xff0c;用于多国化字符转化&#xff09;工具的时候觉得很不方便&#xff0c;有的时候只需要知道中文对应的unicode码是多少&#xff0c;不需要这么麻烦的操作&#xff0c;所以就自己写了一个工具&#xff0c;专门用于将中文…

java lambda 实现_Java 8 Lambda实现原理分析

PDF文档已上传Github为了支持函数式编程&#xff0c;Java 8引入了Lambda表达式&#xff0c;那么在Java 8中到底是如何实现Lambda表达式的呢? Lambda表达式经过编译之后&#xff0c;到底会生成什么东西呢?在没有深入分析前&#xff0c;让我们先想一想&#xff0c;Java 8中每一…

unity game和scene效果不一样_KTV装修设计:如何让消费者体验到不一样的KTV娱乐效果...

现代KTV装修设计要尽显奢华与高贵,但起到吸引消费者的却是浓烈的欢快氛围和愉悦的歌唱体验.KTV想要有一个好的装修效果,需要了解各方面的细节问题.下面怡元小编讲述如何设计能让消费者体验到不一样的KTV娱乐效果?1、氛围设计在KTV装修设计中,氛围设计非常考究,尤其是消费者进入…

SQL學習

1.模糊表名的联合查询..create table tz2008_1_1(id int,name varchar(50))insert into tz2008_1_1 select 1,acreate table tz2008_1_2(id int,name varchar(50))insert into tz2008_1_2 select 2,bcreate table tz2008_1_3(id int,name varchar(50))insert into tz2008_1_3 s…

feather 设置坐标刻度_Matlab中将坐标轴放在原点位置

转载一篇文章&#xff0c;原文链接&#xff1a;https://blog.csdn.net/xiaobiyin9140/article/details/84519419​blog.csdn.net需求使用matlab画图&#xff1a;设置y轴位置&#xff0c;使y轴在x轴的中间示例画一个sigmoid函数MATLAB代码x-10:0.1:10; ysigmf(x,[1 0]); plot(…

hana数据库导入mysql_【SAP HANA】新建表以及操作数据(3)

账号和数据库都创建好之后&#xff0c;接下来就可以创建表了。来见识一下这个所谓“列式”存储方式的表是长啥样的&#xff01;一、可视化新建表然后输入所需栏位&#xff0c;设置好类型和长度&#xff1a;上图右上角可以看到类型是Column Store&#xff0c;代表列式存储&#…

(转)Asp.net 中 Get和Post 的用法

单form的提交有两种方式&#xff0c;一种是get的方法&#xff0c;一种是post 的方法.看下面代码,理解两种提交的区别: <form id"form1" method"get" runat"server"> <div> 你的名字<asp:TextBox ID"name" ru…

matlab lu分解求线性方程组_计算方法(二)直接三角分解法解线性方程组

封面是WH2里春希在编辑部的上司麻理前辈&#xff0c;有一说一&#xff0c;这条线的第一次H有点恶趣味&#xff0c;不是很喜欢。一&#xff1a;概述矩阵分解我学过的挺多种&#xff0c;比如极分解&#xff0c;谱分解&#xff0c;满秩分解&#xff0c;正交三角分解还有这里的直接…

java pdf添加图片水印图片_Java 在PDF中添加文本水印、图片水印

(推荐)方式1&#xff1a;创建Maven项目程序&#xff0c;通过maven仓库下载导入。以IDEA为例&#xff0c;新建Maven项目&#xff0c;在xml文件中配置maven仓库路径&#xff0c;并指定spire.cloud.sdk的依赖&#xff0c;如下&#xff1a;com.e-icebluecloudhttp://repo.e-iceblue…

html弹出保存文件对话框_有没有遇到过CAD文件损坏或打不开的情况?养成这个习惯很重要...

经常使用CAD制图&#xff0c;难免会遇到CAD文件损坏或者打不开的情况&#xff0c;遇到这种情况&#xff0c;我们会想尽办法来恢复文件&#xff0c;而最有效的办法之一就是从备份文件中恢复我们的图形&#xff0c;因此在制图过程中&#xff0c;我们应养成备份的好习惯&#xff0…

用javascript读取xml,并进行修改xml数据,解决保存没有权限问题

从 fsdy2000&#xff08;乡愁&#xff09;提供的方法获得思路&#xff0c;参考公司web gis 脚本实现 http://topic.csdn.net/t/20060105/15/4499889.html可以这样&#xff1a; 在脚本中修改xml文档后。再用xmlhttp进行页面申请。 xmlhttp new Acti…

linux java uml_简单实用UML关系图解

一句话UML&#xff0c;再记不住就要DPP了&#xff1a;关系图解代码备注1&#xff1a;继承关系(Generalization)2&#xff1a;实现关系(Realization)3&#xff1a;依赖关系(Dependency)方法的参数、局部变量、返回值4&#xff1a;关联关系(Association)互为类属性5&#xff1a;方…

python接口和抽象类的区别_接口和抽象类有什么区别?

最近团队在招人&#xff1a;阿里新零售事业群CBU技术部招Java高级&专家&#xff0c;团队主要负责B2B工业品牌业务&#xff0c;坐标杭州滨江&#xff0c;有兴趣的小伙伴私戳我。 ******************************************** 以下是原文&#xff1a; 本身的设计目的就是不…

版本控制工具SVN+Apache整合

一 SVN服务器端基础配置 1.创建文件库&#xff0c;开启服务 假设SVN服务器安装在D盘根目录下&#xff0c;文件库创建为D盘下的repository_svn文件夹。 sc create svnserve binpath "D:\svn-win32-1.5.0\bin\svnserve.exe --service --root D:\repository_svn" displa…

linux scrapy 定时任务_Linux定时任务给心爱的小姐姐发情书

计划任务基本概述什么是crond?crond就是计划任务&#xff0c;类似于我们平时生活中的闹钟&#xff0c;定点执行。为什么要用crond?计划任务主要是做一些周期性的任务&#xff0c;比如: 凌晨3点定时备份数据。或11点开启网站抢购接口&#xff0c;12点关闭抢占接口。计划任务主…

JAVA中修改顺序表中的元素_java – 在列表中查找元素并使用stream()更改它

如果您的目标是只找到一个元素,那么您可以这样做MyItem item l.stream().filter(x -> x.getValue() > 10).findAny() // here we get an Optional.orElseThrow(() -> new RuntimeException("Element 10 wasnt found"));item.setAnotherValue(4);在Java 9中…

产品经理的职责(转)

1、市场调研 市场调研是指研究市场以了解客户需求、竞争状况及市场力量&#xff08;market forces&#xff09;&#xff0c;其最终目标是发现创新或改进产品的潜在机会。 可以通过下面的方式进行市场调研&#xff1a; 与用户和潜在用户交流 与直接面对客户的一线同事如销售、客…

初中文化能学编程吗_网页编程课程来了,确定不来pick一下!!!|科创辅学进行时...

KE CHUANG FU XUE科创辅学天天用手机&#xff0c;各种app 半夜不睡觉&#xff0c;只会网上浪醒醒&#xff0c;少年&#xff0c;别玩了不要再搞这些花里胡哨的东西了&#xff01;要学会用魔法打败魔法上一周&#xff0c;我们跟着夏老师学习了Arduino单片机编程基础这一周开源软…