GoF设计模式之七 Bridge- -

来源:百度文库 编辑:神马文学网 时间:2024/04/28 05:58:48

 

                                      

    B2) Bridge (桥模式)
    定义: 把抽象从实现中分离出来,使得两者可以独立的变化。
    字面上很难理解定义的意思,那从另外一个方面来讲,一个对象可以看作是对象本身和对象行为的结合,那么对于一个抽象对象的具体实现,就是对其自身和行为的实现。而将抽象与实现分离,也就是将自身与行为的分离。打个比方,人是个抽象的定义,那人有吃饭这个抽象的行为。对于人的一个实例中国人,吃饭时候用筷子,而印度人用手,美国人用刀叉。这样就有了三个实现,但中国人有时候吃饭也用刀叉,美国人也会用筷子,这时候如果按照原先的方法,又需要生成两个新的实现,如此就变得复杂而混乱。于是,桥模式就有了用武之地。把人本身与吃饭这个行为分离开来,人有不同的实现,如中国人,美国人,而吃饭也有不同的实现,如用筷子,用手。有点像以前考试里面的连线题,左边是某个历史人物(对象),右边是发生的历史事件(行为),用直线连接,这条线就是一座桥,当然可能一个人做过几件事情。那就以人吃饭为例子,来看桥模式的实现方法。下面是人和吃饭的抽象类。
    public abstract class Person {
        private PersonImp personImp;
        public Person(PersonImp pImp) {
            personImp = pImp;
        }
        public void eat() {
            personImp.eat();
        }
        public String getCountry() {
            return "world";
        }
    }
    public abstract class PresonImp {
        public abstract void eat();
    }
    接下来实现人吃饭的行为,筷子和刀叉
    public class EatByCS extends PresonImp {
        public void eat() {
            // eat by chopsticks
        }
    }
    public class EatByKF extends PresonImp {
        public void eat() {
            // eat by knives and forks
        }
    }

    那么,美国人和中国人的实现就是
    public class American extends Person {
        public String getCountry() {
            return "America";
        }
    }
    public class Chinese extends Person {
        public String getCountry() {
            return "China";
        }
    }

    美国人用筷子吃饭和中国人用刀叉就可以表示为
    Person personA = new American(new EatByCS());
    personA.eat();
    Person personC = new Chinese(new EatByKF());
    personC.eat();

    其他不同的对象与行为的组合也可以以此类推,人可以自由派生,吃饭的方法也可以随意改变,两者变化对对方毫无干扰,体现了桥模式的优势。非常有效的对已有对象的利用,结构层次清晰且更加易于扩展,这就是结构模式的用途。


   参考:
1、 http://www.jdon.com/designpatterns/bridge.htm(中文、java实例)
2、 http://www.dofactory.com/Patterns/PatternBridge.aspx(英文、C#实例、UML)
3、 http://www.techscore.com/tech/DesignPattern/Bridge.html(日文、java实例、UML)推荐