设计模式----桥接模式
目前市面上有很多的手机品牌,不同的手机品牌可能会有不同的操作系统,比如现如今的安卓系统和IOS系统,在安卓系统可以运行的软件在IOS操作系统无法运行,而在IOS系统可以运行的软件在安卓系统也无法运行,这就要求厂家必须按照安卓操作系统和IOS操作系统开发APP,安卓开发一份,IOS开发一份,这从一定程度上来说增加了软件市场的冗余,但是没办法,一家独大的话会造成行业垄断,希望在未来几十年可以实现软件使用的统一,为程序员们省点事。
那如果我让你实现安卓系统和苹果系统的手机运行不同软件这个程序你会怎么写代码呢。
有点基础的同学可能会写一个手机父类,让不同的手机品牌继承这个父类,具体的手机品牌再写专门的类去支持软件的运行。
这样的写法是不是太麻烦了呢?
如果我要添加新的手机品牌,添加新的软件那么就要写很多的类去实现,这实在不是一种明智的选择。
今天介绍的这个设计模式就可以解决这个问题。
UML类图:
代码:
实现功能类:
/** * 抽象调用类 */ public abstract class Abstraction { protected Implementor implementor; public void setImplementor(Implementor implementor){ this.implementor = implementor; } public abstract void run(); }
/** * 具体实现功能类 */ public class RefinedAbstraction extends Abstraction{ @Override public void run() { implementor.Operation(); } }
功能类:
/** * 抽象功能类 */ public abstract class Implementor { abstract void Operation(); }
/** * 具体功能类A */ public class ConcreteImplementorA extends Implementor{ @Override void Operation() { System.out.println("具体实现方法A的实现"); } }
/** * 具体功能类B */ public class ConcreteImplementorB extends Implementor{ @Override void Operation() { System.out.println("具体实现方法B的实现"); } }
客户端代码:
public class Client { public static void main(String[] args) { Abstraction ab = new RefinedAbstraction(); ab.setImplementor(new ConcreteImplementorA()); ab.run(); ab.setImplementor(new ConcreteImplementorB()); ab.run(); } }
控制台输出:
具体实现方法A的实现
具体实现方法B的实现
再回到我们那个例子,如何利用桥接模式实现代码:
功能类:
/** * 抽象软件类 */ public abstract class Soft { abstract public String run(); }
/** * 通讯录软件类 */ public class AddressList extends Soft{ @Override public String run() { return "通讯录运行"; } }
/** * 游戏软件类 */ public class Game extends Soft{ @Override public String run() { return "游戏运行"; } }
手机类:
/** * 抽象手机类 */ public abstract class Phone { protected List<Soft> softs = new ArrayList<>(); public void add(Soft soft){ softs.add(soft); } public abstract void run(); }
/** * 具体手机类 华为 */ public class HUAWEI extends Phone{ @Override public void run() { for (Soft soft : softs) { System.out.println("华为手机的" + soft.run()); } } }
/** * 具体手机类 苹果 */ public class Iphone extends Phone{ @Override public void run() { for (Soft soft : softs) { System.out.println("苹果手机的" + soft.run()); } } }
客户端:
public class Client { public static void main(String[] args) { Phone p1 = new HUAWEI(); p1.add(new AddressList()); p1.add(new Game()); Phone p2 = new Iphone(); p2.add(new AddressList()); p2.add(new Game()); p1.run(); p2.run(); } }
控制台输出:
华为手机的通讯录运行
华为手机的游戏运行
苹果手机的通讯录运行
苹果手机的游戏运行
这种设计模式十分方便,如果我们想添加新的手机或者新的功能,只要提供一个类就好了,节省了开发的时间和维护的成本。