代码编织梦想

合成/聚合复用原则

对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与父类的实现有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。

合成/聚合原则(CARP),尽量使用合成/聚合,尽量不要使用类继承。
合成和聚合都是关联的特殊种类。

聚合表示一种弱的拥有关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。
合成则是一种强的拥有关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。

大雁和翅膀是整体和部分的关系,并且生命周期是相同的,大雁和翅膀就是合成关系。
雁群和大雁,每一个大雁都属于一个雁群,一个雁群有多个大雁,大雁和雁群是聚合关系。
在这里插入图片描述
合成/聚合复用原则的好处,优先使用对象的合成/聚合将有助于保存每个类被封装,并被集中到单个任务上。这样类和类继承层次会保持较小规模,并且不太会增长为不可控制的庞然大物。

合成/聚合复用原则的使用

手机有多种手机品牌,每一种手机品牌都有不同的手机软件。可以让手机品牌和手机软件分离。让手机品牌都包含手机软件。

在这里插入图片描述
在这里插入图片描述
手机品牌包含手机软件,但软件并不是品牌的一部分,它们之间是聚合关系。

手机软件

abstract class HandsetSoft{
    //运行
    public abstract void run();
}
//手机游戏
class HandsetGame extends HandsetSoft{
    public void run(){
        System.out.println("手机游戏");
    }
}
//手机通讯录
class HandsetAddressList extends HandsetSoft{
    public void run(){
        System.out.println("通讯录");
    }
}

手机品牌

abstract class HandsetBrand{
	// 手机品牌包含手机软件
    protected HandsetSoft soft;
    //设置手机软件
    public void setHandsetSoft(HandsetSoft soft){
        this.soft=soft;
    }
    //运行
    public abstract void run();
}
//手机品牌M
class HandsetBrandM extends HandsetBrand{
    public void run(){
        System.out.print("品牌M");
        soft.run();
    }
}
//手机品牌N
class HandsetBrandN extends HandsetBrand{
    public void run(){
        System.out.print("品牌N");
        soft.run();
    }
}

客户端

public class Test {
    public static void main(String[] args) {
        System.out.println("**********************************************");       
        System.out.println("《大话设计模式》代码样例");
        System.out.println();       
        HandsetBrand ab;
        ab = new HandsetBrandM();
        ab.setHandsetSoft(new HandsetGame());
        ab.run();
        ab.setHandsetSoft(new HandsetAddressList());
        ab.run();
        HandsetBrand ab2;
        ab2 = new HandsetBrandN();
        ab2.setHandsetSoft(new HandsetGame());
        ab2.run();
        ab2.setHandsetSoft(new HandsetAddressList());
        ab2.run();
        
        System.out.println();
        System.out.println("**********************************************");
    }
}

如果需要增加手机软件,只需要增加一个手机软件类即可,不会影响其他类。

//手机音乐播放
class HandsetMusicPlay extends HandsetSoft{
    public void run(){
        System.out.print("音乐播放");
    }
}

如果要增加品牌,只需要增加一个品牌类即可。

//手机品牌S
class HandsetBrandS extends HandsetBrand{
    public void run(){
        System.out.print("品牌S");
        soft.run();
    }
}

这样也符合了开放-封闭原则,只扩展,不修改。
合成/聚合原则,优先使用对象的合成和聚合,而不是类继承。继承是一种强耦合的结构,父类变,子类就必须要变。在使用继承的时候,一定要在是 ‘is - a’ 的关系时再考虑使用,而不是任何时候。

桥接模式

桥接模式(Bridge),将抽象部分和实现部分分离,使它们都可以独立地变化。
什么叫抽象与它的实现分离,并不是说,让抽象类与其派生类分离,因为这样没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象。

实现方式有多种,桥接模式的核心意图是把这些实现独立出来,让它们各自变化。这就使得每种实现的变化不会影响其他实现,从而达到应对变化的目的。

在这里插入图片描述
抽象

abstract class Abstraction{
    protected Implementor implementor;
    public void setImplementor(Implementor implementor){
        this.implementor = implementor;
    }
    public abstract void operation();
}
class RefinedAbstraction extends Abstraction{
    public void operation(){
        System.out.print("具体的Abstraction");
        implementor.operation();
    }
}

实现

abstract class Implementor{
    public abstract void operation();
}
class ConcreteImplementorA extends Implementor{
    public void operation(){
        System.out.println("具体实现A的方法执行");
    }
}
class ConcreteImplementorB extends Implementor{
    public void operation(){
        System.out.println("具体实现B的方法执行");
    }
}

客户端

public class Test {
    public static void main(String[] args) {
        System.out.println("**********************************************");       
        System.out.println("《大话设计模式》代码样例");
        System.out.println();       
        Abstraction ab;
        ab = new RefinedAbstraction();
        ab.setImplementor(new ConcreteImplementorA());
        ab.operation();
        ab.setImplementor(new ConcreteImplementorB());
        ab.operation();
        System.out.println();
        System.out.println("**********************************************");
    }
}

将抽象部分和实现部分分离。可以理解为实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。

每一种设计模式都是设计原则的具体应用,只要深入理解了设计原则,或许在不知不觉中就在使用设计模式了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_40540957/article/details/129674954

设计模式-桥接模式_写代码的lorre的博客-爱代码爱编程

定义 桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。 它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。 概述 在软件系统中,某些类型由于自身

c++设计模式-bridge桥接模式_tt_137062185的博客-爱代码爱编程

C++设计模式——桥接模式 概念 将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle an

java桥接模式_java设计模式-----14、桥接模式-爱代码爱编程

Bridge 模式又叫做桥接模式,是构造型的设计模式之一。Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。 举个例子,我们都知道,汽车有不同的发动机,有油

设计模式之桥接模式-爱代码爱编程

模式动机 设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案: • 第一种设计方案是为每一种形状都提供一套各种颜色的版本。 • 第二种设计方案是根据实际需要对形状和颜色进行组合。 对于有两个变化维度(即两个变化的原因)的系统,采用方案二来进行设计系统中类的

从零开始学设计模式(十): 桥接模式(Bridge Pattern)-爱代码爱编程

其他平台: | CSDN:blog.csdn.net/qq\_4115394… | 掘金:juejin.cn/user/651387… | 知乎:www.zhihu.com/people/1024… | GitHub:github.com/JiangXia-10… | 公众号:1024笔记 本文大概3166字,读完共需7分钟 定义

java【设计模式】桥接模式_舒克日记的博客-爱代码爱编程

桥接模式 一、定义二、示例:传统编码方式(关于支付的)桥接模式(关于支付的)桥接模式(几何形状)UML关系图 一、定义 桥接模式:将一个大类或者一系列相关的类拆分为抽象和实现两个独立的层级结构,

设计模式学习-爱代码爱编程

设计模式学习--桥接模式 桥接模式介绍   桥接模式的主要作用:通过抽象部分与实现部分相分离,把多种可匹配的使用相组合。 说白了就是在A类中含有B类的接口,通过构造函数传递B类的实现,这个B类就是设计的桥。 使用场景  那么我们平时开发中有哪些场景是使用到了该模式呢? 最典型的是JDBC多驱动程序的实现,还有同品牌类型的台式机和笔记本,