• 设计模式之桥接模式


    桥接模式(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());
        }

       } 

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

  • 相关阅读:
    js例子
    js表单验证
    Python之Numpy的基础及进阶函数(图文)
    Numpy库的下载及安装(吐血总结)
    世界,你好!
    用逻辑回归模型解决互联网金融信用风险问题
    用逻辑回归模型解决互联网金融信用风险问题
    如何建立投资模型
    如何建立投资模型
    秒懂数据类型的真谛—Python基础前传(4)
  • 原文地址:https://www.cnblogs.com/kingcucumber/p/3221111.html
Copyright © 2020-2023  润新知