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());
        }

       } 

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

  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1046 Shortest Distance (20)
    1061 Dating (20)
    1041 Be Unique (20)
    1015 Reversible Primes (20)(20 分)
    pat 1027 Colors in Mars (20)
    PAT 1008 Elevator (20)
    操作系统 死锁
    Ajax的get方式传值 避免& 与= 号
    让IE浏览器支持CSS3表现
  • 原文地址:https://www.cnblogs.com/kingcucumber/p/3221111.html
Copyright © 2011-2022 走看看