zoukankan      html  css  js  c++  java
  • 设计模式之桥接模式

    桥接模式(Bridge),其含义是将抽象部分与它的实现部分分离,使它们都可以独立地变化。这里的实现指的是功能的实现,并非接口实现。当一个抽象可能有多个实现时,通常用继承来协调它们。抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现。该模式在抽象类与它的实现之间起到了桥梁作用,使它们可以独立地变化。

    其适用性:

    你不希望在抽象和它的实现部分之间有一个固定的绑定关系,

    类的抽象以及它的实现都应该通过生成子类的方法加以扩充。这是Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充

    对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译

    你想对客户完全隐藏抽象的实现部分。在C++中,类的表示在类接口中是可见的

    有许多类要生成,这种类层次结构说明你必须将一个对象分解成两个部分。Rumbaugh称这种类层次结构为”嵌套的普化“

    你想在多个对象间共享实现(可能使用引用计数) ,但同时要求客户并不知道这一点。

    桥接模式更多是提示我们如何组织面向对象设计的分解方式:第一要把依赖具体变成依赖抽象,第二如果同时存在多个正交的变化因素,就顺次展开,逐个抽象,第三为每个抽象因素提供具体实现。

    如下:

    桥接模式避免了在抽象和实现之间建立静态的联系,将其解耦独立变化,如下例子对应上图的模式结构图:

           

    约会是抽象,其实现是活动类,活动类的具体实现是吃饭和看电影,而RefineAbstraction可以是和女生约会或者和女士约会,下面是实现:

     package org.designpattern.structural.bridge;

         public abstract class Dating {
             private Activity activity;
             public Activity getActivity() {
                 return activity;
             }
            public void setActivity(Activity activity) {
                 this.activity = activity;
             }
            public abstract void act(Activity activity);
        }

      Activity.java就是一个接口,package org.designpattern.structural.bridge;

        public interface Activity {
              public void doSomething();
         }

     DateWithGirl.java

    package org.designpattern.structural.bridge;

          public class DateWithGirl extends Dating {
               public void act(Activity activity){
                    activity.doSomething();
           }

         } 

      DateWithLady.java

    package org.designpattern.structural.bridge;

           public class DateWithLady extends Dating{
              public void act(Activity activity){
                 activity.doSomething();
           }

         } 

    下面是两个具体的实现类;

    EatMeal.java

    public class EatMeal implements Activity{

          public void doSomething(){
               System.out.println("eat a meal!");
          }

        } 

      WatchMovies.java

    public class WatchMovies implements Activity {

           public void doSomething(){
               System.out.println("watch movies!");
          }

         } 

      客户测试类:

    public class Main {

        public static void main(String[] args){
            Dating dating = new DateWithGirl();
            dating.act(new WatchMovies());

            Dating dat1 = new DateWithLady();
            dat1.act(new EatMeal());
        }

       } 

    桥接模式是一个非常有用的模式,在需求中的相互关联的抽象有多个变化维度时,需要使用桥接模式来解耦。

  • 相关阅读:
    spring-AnnotationConfigApplicationContext源码阅读
    图解http pdf
    paasone的创新(2):separated langsysdemo ecosystem及demo driven debug
    Plan9:一个从0开始考虑分布式,分布appmodel的os设计
    terra++
    qtcling
    terracling:前端metalangsys后端uniform backend免编程binding生成式语言系统设想
    ubuntu touch: deepin pc os和deepin mobile os的天然融合
    windows版gbc:基于enginx的组件服务器系统paas,可用于mixed web与websocket game
    WinPE VirtIO云主机版 支持west263 阿里云aliyun 送精简win2k3镜像
  • 原文地址:https://www.cnblogs.com/kingcucumber/p/3221111.html
Copyright © 2011-2022 走看看