我是靠谱客的博主 孝顺老虎,最近开发中收集的这篇文章主要介绍设计模式之桥接模式,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

通过手机的设计模式来引出桥接模式,现在不同的手机有不用的品牌,但是功能都是类似的,而且手机有不同的样式,比如折叠手机,直立手机,如果我们我们要生产一款直立的华为手机,一款折叠的华为手机,各个品牌和样式相互组合会变成类爆炸。

显然这样的设计肯定不友好,代码量非常大而且非常难以维护,我们需要增加一个样式的时候对于的类也需要改变,显然违背了单一职责原则,如果我们用桥接模式可以很友好的解决此问题。

桥接模式:将实现和抽象放在两个不同的类层次中,使两个层次可以独立改变,桥接模式是一种结构型设计模式。桥接模式基于类的最小设计原则,通过使用封装,聚合已集成等行为让不同的类承担不同的职责,它主要的特点是把抽象与行为实体分离开来,从而可以保持各部分的独立性以为功能的扩展性。

原理图:

Client:桥接模式的调用者。

抽象类(Abstraction):维护了Implementor/即它的实现类ConcreteImplementorA...,二者之间是聚合关系,Abstraction充当桥接类。

RefindAbstraction:是Abstraction的子类。

Implementor:行为实体的类的接口

ConcreteImplementorA/B:行为的具体实现类

下面通过手机改进的代码来演示桥接模式:

/**
 *  手机拥有的功能
 * @author Administrator
 *
 */
public interface Brand {

    //开机
    void open();
    
    //关机
    void close();
    
    //打电话
    void call();
}

 

public class XiaoMiBrand implements Brand {

    @Override
    public void open() {
        System.out.println("打开小米手机,为发烧而生");
    }

    @Override
    public void close() {
        System.out.println("关闭小米手机,为发烧而生");
    }

    @Override
    public void call() {
        System.out.println("小米手机打电话");
    }

}

 

 

package com.yu.demo.brand;

public class HuaWeiBrand implements Brand {

    @Override
    public void open() {
        System.out.println("打开华为手机,为梦想");
    }

    @Override
    public void close() {
        System.out.println("关闭华为手机");
    }

    @Override
    public void call() {
        System.out.println("华为手机打手机");
    }

}
 

 

public class Phone {

    //聚合桥接
    Brand brand;
    
    public Phone(Brand brand) {
        this.brand = brand;    
    }
    
    //打开手机
    protected void open() {
        brand.open();
    }
    
    //手机关机
    protected void close() {
        brand.open();
    }
    
    //手机打电话
    protected void call() {
        brand.open();
    }
    
}

 

public class ErectPhone extends Phone{

    public ErectPhone(Brand brand) {
        super(brand);
    }

    @Override
    protected void open() {
        System.out.println("直立手机");
        super.open();
    }

    @Override
    protected void close() {
        System.out.println("直立手机");
        super.close();
    }

    @Override
    protected void call() {
        System.out.println("直立手机");
        super.call();
    }
}

 

 

public class FoldedPhone extends Phone{

    public FoldedPhone(Brand brand) {
        super(brand);
    }

    @Override
    protected void open() {
        System.out.println("折叠手机");
        super.open();
    }

    @Override
    protected void close() {
        System.out.println("折叠手机");
        super.close();
    }

    @Override
    protected void call() {
        System.out.println("折叠手机");
        super.call();
    }

    
}

 

 

/**
 * 生产手机
 * @author Administrator
 *
 */
public class Client {

    public static void main(String[] args) {
        Brand huawei = new HuaWeiBrand();
        Brand xiaomi = new XiaoMiBrand();
        System.out.println("生产直立的小米手机");
        ErectPhone erectXaiomiPhone = new ErectPhone(xiaomi);
        erectXaiomiPhone.open();
        erectXaiomiPhone.call();
        erectXaiomiPhone.close();
        System.out.println("-============================");
        System.out.println("生产折叠的华为手机");
        FoldedPhone foldedHuaweiPhone = new FoldedPhone(huawei);
        foldedHuaweiPhone.open();
        foldedHuaweiPhone.call();
        foldedHuaweiPhone.close();
    }
}

注意事项:

  • 实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现独立开来,有助于系统进行分层设计,从而产生更好的结构化系统。
  • 对于系统的高层部分,只需要抽象部分和实现部分的接口就可以了,其他部分由具体的业务来完成。
  • 桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。
  • 桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。

桥接模式要求正确的识别出系统中两个独立变化的维度(抽象和实现),因此其使用范围有一定的局限性,需要在特定的场合才能使用。使用场景:

银行的转账系统,转账的分类:网上转账,柜台转账,AMT转账。转账用户:普通用户,VIP用户。

消息系统,消息的类型:及时消息,推送消息,消费的分类:手机短信,邮件信息。

最后

以上就是孝顺老虎为你收集整理的设计模式之桥接模式的全部内容,希望文章能够帮你解决设计模式之桥接模式所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部