美文网首页
桥接模式

桥接模式

作者: lgy_gg | 来源:发表于2017-09-16 15:45 被阅读0次

    1.桥接模式概念

    在《Head First Design Patterns》文中是这么介绍桥接模式的,“不仅可以改变你的实现,也可以改变你的抽象”。这句话说得一头雾水,这里的实现和抽象指的是什么呢?下面会通过例子来解释。

    2.桥接模式的作用

    把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

    3.使用场景

    实现系统可能有多个角度分类,每一种角度都可能变化。说实话,我不懂怎么总结,只能通过例子来说明。

    4.优点和缺点

    优点
    1、抽象和实现的分离,不会互相影响。
    2、对于具体的抽象类的修改,不会影响到客户。
    缺点
    增加系统的理解与设计难度。

    5.例子解析

    桥接模式例子解析类图

    这是一个遥控器和TV的例子。遥控器控制TV,不同的遥控器控制不同的TV.
    遥控器抽象类(这个类可以是抽象类或者是接口)

    package com.lgy.test;
    
    /**
     * @author LGY
     * 把抽象化与实现化解耦,使得二者可以独立变化。这句化还真不好理解。我自己理解是这样的就以遥控器和TV来解释。
     * 不同的遥控器控制不同的TV。这里遥控器和TV都有可能发生变化,为了实现解耦,最好就是能将她们分开,独立让他们变化。
     * 但是这里的抽象化和实现化指的是啥?就本例来说,抽象化指的是遥控器,实现化指的是TV.只要我们能够区分是谁控制谁就很好理解了
     * 这里很明显是遥控器控制TV.而且代码中也很明显,RemoteControl和TV的关系是RemoteControl Has-a TV的关系
     */
    public abstract class RemoteControl {
    
        TV imprementor;
        
        public RemoteControl(TV imprementor) {
            this.imprementor = imprementor;
        }
        abstract void on();
        abstract void off();
        public void setChannel(int station)
        {
            imprementor.tuneChannel(station);
        }
    }
    

    遥控器具体实现类

    package com.lgy.test;
    
    public class ConcrateRemote extends RemoteControl{
    
        public ConcrateRemote(TV imprementor) {
            super(imprementor);
        }
        private int currentStation;
        
        @Override
        void on() {
            imprementor.on();
        }
    
        @Override
        void off() {
            imprementor.off();
        }
    
        public void setStation(int station) {
            this.currentStation = station;
        }
        
        public void nextChannel() {
            setStation(currentStation+1);
            setChannel(currentStation);
        }
        public void previousChannel() {
            setStation(currentStation-1);
            setChannel(currentStation);
    
        }
    }
    

    TV接口

    package com.lgy.test;
    
    public interface TV {
    
        void on();
        void off();
        void tuneChannel(int station);
    }
    

    TV具体类:RCA

    package com.lgy.test;
    
    public class RCA implements TV{
    
        @Override
        public void on() {
            System.out.println("RCA ON");
        }
    
        @Override
        public void off() {
            System.out.println("RCA OFF");
        }
    
        @Override
        public void tuneChannel(int station) {
            System.out.println("RCA current station "+station);
        }
    }
    

    TV具体类:Sony

    package com.lgy.test;
    
    public class Sony implements TV{
    
        @Override
        public void on() {
            System.out.println("Sony ON");
        }
    
        @Override
        public void off() {
            System.out.println("Sony OFF");
        }
    
        @Override
        public void tuneChannel(int station) {
            System.out.println("Sony current station "+station);
        }
    }
    

    客户端:

    package com.lgy.test;
    
    public class Client {
    
        public static void main(String[] args) {
            TV tv = new RCA();
            ConcrateRemote concrateRemote = new ConcrateRemote(tv);
            concrateRemote.on();
            concrateRemote.nextChannel();
            concrateRemote.nextChannel();
            concrateRemote.nextChannel();
            concrateRemote.nextChannel();
            concrateRemote.previousChannel();
    
            concrateRemote.off();
        }
    }
    

    6.总结

    把抽象化与实现化解耦,使得二者可以独立变化。这句化还真不好理解。我自己理解是这样的,就以遥控器和TV来解释。不同的遥控器控制不同的TV。这里遥控器和TV都有可能发生变化,为了实现解耦,最好就是能将她们分开,独立让他们变化。但是这里的抽象化和实现化指的是啥?就本例来说,抽象化指的是遥控器,实现化指的是TV.只要我们能够区分是谁控制谁就很好理解了,这里很明显是遥控器控制TV.而且代码中也很明显,RemoteControl和TV的关系是RemoteControl Has-a TV的关系。

    7.源码地址

    http://download.csdn.net/download/lgywsdy/9981845

    相关文章

      网友评论

          本文标题:桥接模式

          本文链接:https://www.haomeiwen.com/subject/mxaysxtx.html