有两种遥控器,蓝牙与红外线。有很多品牌的电视,每种遥控器控制一种电视。根据上面的描述我们很快想到一种实现方式,将遥控器设为一个父类,不同的遥控器去继承扩展他。
简单的继承:
从上图可以看出,有2种遥控器,有3种品牌的电视,一共需要2*3=6个子类。假如遥控器种类是N,电视品牌种类是M,那么最终需要的子类是N*M。
缺点:
1. 这样的实现方式会使得我们的子类非常的多,代码量会增大。
2. 如果父类有修改,所有的子类都有可能需要修改,修改量大,不方便后续维护。
使用桥接模式做优化:
抽象出1个基类和1个接口。
优点:
1. 最终需要的子类是N+M,减少了代码量。
2. 类图好看,分层清晰,一目了然。父类有修改也不会影响所有的子类。
定义:将抽象部分与实现部分分离,使他们都可以独立的变化。
我们可以这样理解:
Client: 客户端,调用的类。
Abstraction: 抽象类,维护对行为实现的引用(调用ConcreteImplementor的实现)。
RefinedAbstraction: 抽象类的子类,重写父类的实现。
Implementor: 接口,行为实现的接口(Abstraction中定义了存在的操作)。
ConcreteImplementor: 实现Implementor的行为。
(1)首先我们定义了遥控器的抽象类和电视的行为
Abstraction:
public abstract class AbstractRemoteConctol { private ITV mTV; public AbstractRemoteConctol(ITV pTV) { mTV = pTV; } public void powerOnTV() { mTV.powerOn(); } }
Implementor:
public interface ITV { public void powerOn(); }
(2)然后我们分别实现不同品牌的电视的行为
ConcreteImplementor:
public class SonyTV implements ITV { @Override public void powerOn() { System.out.println("Sony TV 已经启动。"); } }
public class SamSungTV implements ITV { @Override public void powerOn() { System.out.println("Samsung TV 已经启动。"); } }
(3)实现抽象类的子类
RefinedAbstraction:
public class IRRC extends AbstractRemoteConctol { public IRRC(ITV pTV) { super(pTV); } public void powerOn() { System.out.println("使用红外线遥控器"); powerOnTV(); } }
public class BluetoothRC extends AbstractRemoteConctol { public BluetoothRC(ITV pTV) { super(pTV); } public void powerOn() { System.out.println("使用蓝牙遥控器"); powerOnTV(); } }
(4)最后试客户端的调用
public class BridgeTest { public static void main(String[] args) { ITV samsumgTV = new SamSungTV(); BluetoothRC bluetoothRC = new BluetoothRC(samsumgTV); bluetoothRC.powerOn(); IRRC irRC = new IRRC(samsumgTV); irRC.powerOn(); } }
打印如下:
使用蓝牙遥控器
Samsung TV 已经启动。
使用红外线遥控器
Samsung TV 已经启动。
MVC模式,表现层通过接口调用逻辑层,表现层的变化不会影响逻辑层;逻辑层通过接口调用数据层,逻辑层的变化不会影响数据层。
代码之前写好了,后头看的时候还能理解,但是发现这个模式自己理解也不是非常透彻。于是上网找别人的介绍,找到好的例子拿来使用。现在看来说的还算明白,但是关于使用场景和实际应用部分其实可以再深入,不过这样做的话,时间又得花很多。
文章的粗体和红色使用比较多,希望突出重点,第一次这样尝试,后续文章针对效果做优化。
待以后再完善使用场景和实际应用。
原文地址:http://blog.csdn.net/mtt1987/article/details/42012647