zoukankan      html  css  js  c++  java
  • 一天学习一个设计模式之桥接模式

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

      以手机为例。手机有各个品牌,手机又得实现各种软件的运行。

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

    1 /**
    2  * 手机软件接口
    3  */
    4 public interface IHandsetSoft {
    5     void run();
    6 }
    1 /**
    2  * 手机游戏(属于软件)
    3  */
    4 public class HandsetGame implements IHandsetSoft {
    5     @Override
    6     public void run() {
    7         System.out.println("运行手机游戏");
    8     }
    9 }
    1 /**
    2  * 手机通讯录
    3  */
    4 public class HandsetAddressList implements IHandsetSoft {
    5     @Override
    6     public void run() {
    7         System.out.println("运行手机通讯录");
    8     }
    9 }
    1 public class HandsetMP3 implements IHandsetSoft {
    2     @Override
    3     public void run() {
    4         System.out.println("运行MP3");
    5     }
    6 }
    1 public abstract class HandsetBrand {
    2     IHandsetSoft soft;
    3     //安装手机软件
    4     public void setHandsetSoft(IHandsetSoft soft){
    5         this.soft=soft;
    6     }
    7     //运行
    8     public abstract void run();
    9 }
    1 /**
    2  * 手机品牌华为
    3  */
    4 public class HandsetBrandHuawei extends HandsetBrand{
    5     @Override
    6     public void run() {
    7         soft.run();
    8     }
    9 }
    1 public class HandsetBrandXiaoMi extends HandsetBrand {
    2     @Override
    3     public void run() {
    4         soft.run();
    5     }
    6 }
     1 public class Client {
     2     public static void main(String[] args) {
     3         HandsetBrand ab;
     4         ab=new HandsetBrandHuawei();
     5         //华为安装游戏软件
     6         ab.setHandsetSoft(new HandsetGame());
     7         ab.run();
     8         //华为安装通讯录软件
     9         ab.setHandsetSoft(new HandsetAddressList());
    10         ab.run();
    11 
    12         ab=new HandsetBrandXiaoMi();
    13         //小米安装游戏软件
    14         ab.setHandsetSoft(new HandsetGame());
    15         ab.run();
    16         //小米安装游戏软件
    17         ab.setHandsetSoft(new HandsetAddressList());
    18         ab.run();
    19         //小米安装游戏软件
    20         ab.setHandsetSoft(new HandsetMP3());
    21         ab.run();
    22     }
    23 }

          桥接是一个接口,它与一方应该是绑定的,也就是解耦的双方中的一方必然是继承这个接口的,这一方就是实现方,而另一方正是要与这一方解耦的抽象方,如果不采用桥接模式,一般我们的处理方式是直接使用继承来实现,这样双方之间处于强链接,类之间关联性极强,如要进行扩展,必然导致类结构急剧膨胀。采用桥接模式,正是为了避免这一情况的发生,将一方与桥绑定,即实现桥接口,另一方在抽象类中调用桥接口(指向的实现类),这样桥方可以通过实现桥接口进行单方面扩展,而另一方可以继承抽象类而单方面扩展,而之间的调用就从桥接口来作为突破口,不会受到双方扩展的任何影响

  • 相关阅读:
    当使用vue的按键修饰符不起效果的时候怎么办?如@keyup.enter = '' ;
    Android 破解
    粒子跟随3
    关于国际化
    一些js及css样式
    Could not find method google() for arguments [] on repository container.
    redis
    window cmd 自动补全
    gradle中的 settings.gradle
    for(String s:list)的运行
  • 原文地址:https://www.cnblogs.com/gousheng107/p/8005692.html
Copyright © 2011-2022 走看看