设计模式之桥接模式·合成/聚合复用原则

目录

1.概念:

  1.1桥接模式概念

 1.2合成/聚合复用原则概念:

2.桥接模式的结构图

3.练习的例子

 4.练习的结构图:

 5.总结:


1.概念:

  1.1桥接模式概念

        将抽象部分和他的实现部分分离开来,使他们都可以独立的变化

 

抽象部分和他的实现部分分离开来,这句话的意思并不是将抽象类和他的派生类分离开来,这样做并没有什么意义,实现部分是指抽象类和派生类用来实现自己的对象

 1.2合成/聚合复用原则概念:

        尽量使用合成/聚合,尽量不要使用继承

 合成(Composition,也有翻译成组合)和聚合(Aggregation)都是关联的特殊种类。

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

比方说,大雁有两个翅膀,翅膀与大雁是部分和整体的关系,并且它们的生命周期是相同的,于是大雁和翅膀就是合成关系。而大雁是群居动物,所以每只大雁都是属于一个雁群,一个雁群可以有多只大雁,所以大雁和雁群是聚合关系。”

合成/聚合复用原则的好处是,优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。
 

继承是一种强耦合的结构,父类变,子类就必须要变,所以在用继承时,一定要在是‘is-a’的关系时再考虑使用,而不是任何时候都去使用。

2.桥接模式的结构图

3.练习的例子

抽象的手机品牌(Abstraction类):

/**
 * 抽象的手机品牌类
 */
@Data
abstract class PhoneBrand {
    private String name;
    //手机品牌包含手机软件 但是手机软件不是手机品牌的一部分所以他俩是"聚合"关系
    private PhoneSoft phoneSoft;

    public PhoneBrand(String name){
        this.name = name;
    }

    public abstract void run();
}

手机品牌A(RefinedAbstraction):

/**
 * A品牌手机
 */
public class BrandA extends PhoneBrand{



    public BrandA(String name) {
        super(name);
    }

    @Override
    public void run() {
      getPhoneSoft().run();
    }
}

手机品牌B(RefinedAbstraction): 

/**
 * B品牌手机
 */
public class BrandB extends PhoneBrand{


    public BrandB(String name) {
        super(name);
    }

    @Override
    public void run() {
        getPhoneSoft().run();
    }
}

 抽象的软件类(Implementor):

/**
 * 抽象的手机软件类
 */
abstract class PhoneSoft {
    public abstract void run();
}

游戏软件(ConcreteImplementor):

/**
 * 游戏软件
 */
public class Game extends PhoneSoft{
    @Override
    public void run() {
        System.out.println("运行游戏");
    }
}

 通讯录软件(ConcreteImplementor):

/**
 * 通讯录软件
 */
public class AddressList extends PhoneSoft{
    @Override
    public void run() {
        System.out.println("运行通讯录");
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        PhoneBrand brandA = new BrandA("品牌A手机");
        brandA.setPhoneSoft(new Game());
        System.out.print(brandA.getName() + ":");
        brandA.run();

        brandA.setPhoneSoft(new AddressList());
        System.out.print(brandA.getName() + ":");
        brandA.run();

        System.out.println();

        PhoneBrand brandB = new BrandB("品牌B手机");
        brandB.setPhoneSoft(new Game());
        System.out.print(brandB.getName() + ":");
        brandB.run();

        brandB.setPhoneSoft(new AddressList());
        System.out.print(brandB.getName() + ":");
        brandB.run();
    }
}

控制台:

 4.练习的结构图:

 5.总结:

理解桥接模式:实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少他们之间的耦合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值