zoukankan      html  css  js  c++  java
  • 设计模式学习笔记——桥接(Bridge)模式

    学习桥接模式时,参考了云飞龙行的“研磨设计模式之桥接模式”一文,感觉作者讲得很好,清晰易懂。

    该文地址:http://www.cnblogs.com/sjms/archive/2010/09/01/1814718.html

    桥接模式:

    定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。所谓桥接,通俗点说就是在不同的东西之间搭一个桥,让他们能够连接起来,可以相互通讯和使用。那么在桥接模式中到底是给什么东西来搭桥呢?就是为被分离了的抽象部分和实现部分来搭桥。在桥接模式中的桥接是单向的,也就是只能是抽象部分的对象去使用具体实现部分的对象,而不能反过来,也就是个单向桥。

    模式结构和说明:

    2010090609125164

    说明:

    Abstraction:

    抽象部分的接口。通常在这个对象里面,要维护一个实现部分的对象引用,在抽象对象里面的方法,需要调用实现部分的对象来完成。这个对象里面的方法,通常都是跟具体的业务相关的方法。

    RefinedAbstraction:

    扩展抽象部分的接口,通常在这些对象里面,定义跟实际业务相关的方法,这些方法的实现通常会使用Abstraction中定义的方法,也可能需要调用实现部分的对象来完成。

    Implementor:

    定义实现部分的接口,这个接口不用和Abstraction里面的方法一致,通常是由Implementor接口提供基本的操作,而Abstraction里面定义的是基于这些基本操作的业务方法,也就是说Abstraction定义了基于这些基本操作的较高层次的操作。

    ConcreteImplementor:

    真正实现Implementor接口的对象。

    (1)先看看Implementor接口的定义,示例代码如下:

    /**
     * 定义实现部分的接口,可以与抽象部分接口的方法不一样
     */
    public interface Implementor {
    	/**
    	 * 示例方法,实现抽象部分需要的某些具体功能
    	 */
    	public void operationImpl();
    }

    (2)再看看Abstraction接口的定义,注意一点,虽然说是接口定义,但其实是实现成为抽象类。示例代码如下:

    /**
     * 定义抽象部分的接口
     */
    public abstract class Abstraction {
    	/**
    	 * 持有一个实现部分的对象
    	 */
    	protected Implementor impl;
    	/**
    	 * 构造方法,传入实现部分的对象 
    	 * @param impl 实现部分的对象
    	 */
    	public Abstraction(Implementor impl){
    		this.impl = impl;
    	}
    	/**
    	 * 示例操作,实现一定的功能,可能需要转调实现部分的具体实现方法
    	 */
    	public void operation() {
    		impl.operationImpl();
    	}
    }

    (3)该来看看具体的实现了,示例代码如下:

    /**
     * 真正的具体实现对象
     */
    public class ConcreteImplementorA implements Implementor {
    	public void operationImpl() { 
    		//真正的实现
    	}
    }
    另外一个实现,示例代码如下:
    /**
     * 真正的具体实现对象
     */
    public class ConcreteImplementorB implements Implementor {
    	public void operationImpl() { 
    		//真正的实现
    	}
    }

    (4)最后来看看扩展Abstraction接口的对象实现,示例代码如下:

    /**
     * 扩充由Abstraction定义的接口功能
     */
    public class RefinedAbstraction extends Abstraction {
    	public RefinedAbstraction(Implementor impl) {
    		super(impl);
    	}
    	/**
    	 * 示例操作,实现一定的功能
    	 */
    	public void otherOperation(){
    		//实现一定的功能,可能会使用具体实现部分的实现方法,
    		//但是本方法更大的可能是使用Abstraction中定义的方法,
    		//通过组合使用Abstraction中定义的方法来完成更多的功能
    	}
    }
    (5)一个测试类:
    public class Test{
    	public static void main(String [] args){
    		ConcreteImplementorA implA = new ConcreteImplementorA();
    		ConcreteImplementorB implB = new ConcreteImplementorB();
    		RefinedAbstraction client = new RefinedAbstraction(implA);
    		client.operation();//调用implA方法
    		client=new RefinedAbstraction(implB);
    		client.operation();//调用implB方法
    	}
    }
    实现了抽象和实现的完美分离。
  • 相关阅读:
    Leetcode463. Island Perimeter
    C++ 编写的解码器小程序 map
    LeetCode706. Design HashMap
    LeetCode705. Design HashSet
    LeetCode804. Unique Morse Code Words
    c++后台开发 准备材料
    Scott Young-《如何高效学习》
    跳表和散列
    时间复杂度 log n
    第35题:LeetCode138. Copy List with Random Pointer
  • 原文地址:https://www.cnblogs.com/coser/p/2018345.html
Copyright © 2011-2022 走看看