之所以把模板模式和桥接模式联系到一块儿说,是因为我最近写一个HBaseTemplate的时候突然发现按照模板模式去写,使用的时候必须继承自该类,很重量级,不优雅。于是对他进行改造,改造之后发现这不就是桥接模式吗?
先说一下什么是模板模式?
引用《设计模式之禅》中的模板模式的定义:定义一个操作中算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
我个人通俗的解释是某件事有成型或者固有的操作流程,先干A,再干B,最后干C,而A,C是必须要干的,而且每个流程都一样,那么我们可以定义一个抽象类,把B这件事定义为一个抽象方法,让子类去实现,不同的B就有不同的子类,但是主流程没有变,而且也不用管A和C,只关注B就行了。
比如我们用HBase的时候,要先设置configuration、然后再获取connection,然后根据tablename获取HTable,根据HTable去做put,get操作,用完后关闭table。
public static HConnection CONNECTION = null; HTable table = null; try{ CONF = HBaseConfiguration.create(); CONNECTION = HConnectionManager.createConnection(CONF); table = (HTable) CONNECTION.getTable(tableName); Put rowPut = new Put(Bytes.toBytes(rowKey)); table.put(rowPut); }catch(Exception e){ if(table != null){ table.close(); } }
如以上步骤,只有7、 8两行是实际业务有用的操作,其他部分所有的都得写一遍,太费事了。
于是定义了一个抽象模板类
public abstract class HBaseTemplate { public void execute(String tableName) { Configuration CONF = null; HConnection CONNECTION = null; HTable table = null; try { CONF = HBaseConfiguration.create(); CONNECTION = HConnectionManager.createConnection(CONF); table = (HTable) CONNECTION.getTable(tableName); doInTable(table); } catch (Exception e) { if (table != null) { try { table.close(); } catch (Exception e1) { e1.printStackTrace(); } } } } public abstract void doInTable(HTable hTable); }
以上红色代码是实际要做的事情,实际用的时候继承该类,实现doInTable()方法就可以了,获取connection、关闭连接等都不用管了。
这就是一个典型的模板模式,类图如下:
什么是桥接模式?
以上模板模式存在的问题是每次使用都需要继承父类,很重量级。针对以上结构做了如下改造
public class HBaseTemplate { public void execute(String tableName,TableCallback tableCallback) { Configuration CONF = null; HConnection CONNECTION = null; HTable table = null; try { CONF = HBaseConfiguration.create(); CONNECTION = HConnectionManager.createConnection(CONF); table = (HTable) CONNECTION.getTable(tableName); tableCallback.doInTable(table); } catch (Exception e) { if (table != null) { try { table.close(); } catch (Exception e1) { e1.printStackTrace(); } } } } } public static interface TableCallback { void doInTable(HTableInterface table) throws Exception; } }
把之前的抽象方法变成了接口,这样用的时候可以这样:
HBaseTemplate hbaseTemplate = new HBaseTemplate(); hbaseTemplate.execute("tableName1", new TableCallback() { @Override public void doInTable(HTableInterface table) throws Exception { //do something... } });
也可以把匿名内部类的实现单独定义为一个类TableCallBackImpl,动态给hbaseTemplate注入进来,这样既灵活又不用继承。
以上是对模板模式的一个改造,以上只是针对获取htable后的操作的变化,但是如果获取htable的方法也变化怎么办,比如以后我要维护一个HTable的池,不每次都"获取table->用table->关闭连接",而是同一个tableName维护一定数量的table,每次从池里取,可以快速,并节省资源。可以再改造
public abstract class HBaseTemplate { public void execute(String tableName,TableCallback tableCallback) { Configuration CONF = null; HConnection CONNECTION = null; HTable table = null; try { getTable(tableName); tableCallback.doInTable(table); } catch (Exception e) { if (table != null) { try { table.close(); } catch (Exception e1) { e1.printStackTrace(); } } } } public static interface TableCallback { void doInTable(HTableInterface table) throws Exception; } public abstract HTable getTable(String tableName); }
这样就可以有HBasePoolTemplate、HBaseNotPoolTemplate实现了获取table维度的扩展。
其实也大可以把getTable()抽象方法改成接口类,动态注入进来。
写着写着感觉我们平常写Controller、Service类的时候就是在注入各种service、dao,头大了吧,其实设计模式只是一种理念、一种思想,体现到类图上可能会很像,甚至一样。理解这种思想,在实际工作中有意识的去应用,而不是随便乱堆代码就可以了。时间长了自然能写出很优雅的代码,设计模式神马的已经融入血液了,无意识的就知道什么场景该怎么写,已经不管他什么模式了。就像张三丰教张无忌太极剑,最后张无忌一招都不记得了,但却很厉害!
如果不是这么做还是按照之前模板模式的方案,那么每有一个htable的操作都要有一个子类HBaseDao1,HBaseDao2,如果再加上连接池,那么又要继承自HBaseDao1,HBaseDao2,就出现了HBasePoolDao1,HBasePoolDao2,如果有三个维度的变化那类的扩张速度就更多了。
桥接模式定义:将抽象和实现解耦,使得两者可以独立的变化。
桥接模式类图:
1.Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。
2.所谓抽象和实现沿着各自维度的变化,即“子类化”它们,得到各个子类之后,便可以任意组合它们。
3.Bridge模式的应用一般在“两个非常强的变化维度(以上例子的两个维度是:获取htable、应用htable做增删改)”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。
相关推荐
"设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式不仅对面试有所帮助,也是职场发展中的必备技能,无论你使用哪种开发语言。 设计...
在软件设计领域,设计模式是经过时间和实践验证的解决方案模板,用于解决常见问题。本实验主要探讨了两种经典的设计模式:桥接模式(Bridge Pattern)和装饰模式(Decorator Pattern)。这两种模式都是面向对象设计...
在编程世界中,设计模式是解决常见问题的模板,提供了可重用的解决方案。本话题主要探讨了如何在C#中结合桥接、装饰、工厂和单例这四种设计模式来实现一个绘图软件。这些模式的应用使得软件具有更高的灵活性、可扩展...
适配器模式(Adapter Pattern)和桥接模式(Bridge Pattern)是两种非常重要的设计模式,它们各自在特定场景下发挥着重要作用。 适配器模式的核心思想是将两个不兼容的接口进行适配,使得原本无法一起工作的类能够...
设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:...
在OOD中,设计模式是一种解决常见问题的模板,它是在特定上下文中经过验证的解决方案。设计模式不是具体的代码,而是一种通用的、可复用的设计方案,描述了在特定情况下,如何将对象和类组织在一起以解决特定问题。...
设计模式分为三大类: 创建型模式,共五种: 工厂方法模式、抽象工厂模式、单例模式、构建者模式、原型模式。 结构型模式,共七种: 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。...
python 项目里常用的设计模式 单例模式 组合模式 策略模式 抽象工厂 代理模式 工厂模式 观察者模式简单工厂 建造者模式 模板模式 桥接多维度 桥接模式 适配器模式 外观模式 享元模式 责任链组合模式
适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式(11): 策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、...
在这个"设计模式课程设计模板"中,我们可以期待学习到以下几个主要的知识点: 1. **设计模式分类**:设计模式通常分为三类——创建型、结构型和行为型。创建型模式关注对象的创建,如单例模式、工厂模式、抽象工厂...
桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 行为模式(类行为模式) 解释器模式 模板方法模式 行为模式(对象行为模式) 策略模式 观察者模式 状态模式 导入模式 迭代器模式 命令模式 职责链模式 进来...
其中包括代理模式(Proxy)、装饰器模式(Decorator)、适配器模式(Adapter)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)和享元模式(Flyweight)。这些模式帮助我们在不修改原有代码的情况...
总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...
《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...
设计模式是解决软件开发中常见问题的经验总结,是软件工程的最佳实践之一。本手册将详细阐述23种经典设计模式,并结合C#语言特性,给出具体实现和应用示例。 首先,我们来了解一下设计模式的基本概念。设计模式是...
设计模式06-适配器、桥接、组合模式 设计模式07-组合模式、装饰模式 设计模式09-外观模式、享元模式 设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式...
包括创建型模式(如单例模式、工厂方法模式、抽象工厂模式)、结构型模式(如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式、享元模式)以及行为型模式(如责任链模式、命令模式、解释器模式、...
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...