Java设计模式之桥梁模式(Bridge Pattern)

目录

定义

使用场景

设计原则

定义

Decouple an abstraction from its implementation so that the two can vary

independently.(将抽象和实现解耦,使得两者可以独立地变化。)● Abstraction——抽象化角色

它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色

一般是抽象类。

● Implementor——实现化角色

它是接口或者抽象类,定义角色必需的行为和属性。

● RefinedAbstraction——修正抽象化角色

它引用实现化角色对抽象化角色进行修正。

● ConcreteImplementor——具体实现化角色

它实现接口或抽象类定义的方法和属性。

使用场景

● 不希望或不适用使用继承的场景

● 接口或抽象类不稳定的场景

● 重用性要求较高的场景

注意:

发现类的继承有 N 层时,可以考虑使用桥梁模式。桥梁模式主要考虑如何拆分抽

象和实现。

设计原则

●Single Responsibility Principle:单一职责原则

单一职责原则有什么好处:

● 类的复杂性降低,实现什么职责都有清晰明确的定义;

● 可读性提高,复杂性降低,那当然可读性提高了;

● 可维护性提高,可读性提高,那当然更容易维护了;

●变更引起的风险降低,变更是必不可少的,如果接口的单一职责做得好,一个接

口修改只对相应的实现类有影响,对其他的接口无影响,这对系统的扩展性、维护

性都有非常大的帮助。

ps:接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。

单一职责原则提出了一个编写程序的标准,用“职责”或“变化原因”来衡量接口

或类设计得是否优良,但是“职责”和“变化原因”都是不可度量的,因项目而异,因

环境而异。

● Liskov Substitution Principle:里氏替换原则

定义:Functions that use pointers or references to base classes must be able to

use objects of derived classes without knowing it.

(所有引用基类的地方必须能透明地使用其子类的对象。)

通俗点讲,只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任

何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是,反过来就不

行了,有子类出现的地方,父类未必就能适应。

定义中包含的四层含义

1.子类必须完全实现父类的方法

2.子类可以有自己的个性

3.覆盖或实现父类的方法时输入参数可以被放大

如果父类的输入参数类型大于子类的输入参数类型,会出现父类存在的地

方,子类未必会存在,因为一旦把子类作为参数传入,调用者很可能进入子类的方

法范畴。

4. 覆写或实现父类的方法时输出结果可以被缩小

父类的一个方法的返回值是一个类型 T,子类的相同方法(重载或覆写)的返

回值为 S,那么里氏替换原则就要求 S 必须小于等于 T,也就是说,要么 S 和 T

是同一个类型,要么 S 是 T 的子类。

● Interface Segregation Principle:接口隔离原则

接口分为两种:

实例接口(Object Interface):Java 中的类也是一种接口

类接口(Class Interface): Java 中经常使用 Interface 关键字定义的接口

隔离:建立单一接口,不要建立臃肿庞大的接口;即接口要尽量细化,同时接口中

的方法要尽量少。

接口隔离原则与单一职责原则的不同:接口隔离原则与单一职责的审视角度是不相

同的,单一职责要求的是类和接口职责单一,注重的是职责,这是业务逻辑上的划

分,而接口隔离原则要求接口的方法尽量少。

● Dependence Inversion Principle:依赖倒置原则

原始定义:

①高层模块不应该依赖低层模块,两者都应该依赖其抽象;

②抽象不应该依赖细节(实现类);

③细节应该依赖抽象。

依赖倒置原则在 java 语言中的体现:

①模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是

通过接口或抽象类产生的;

②接口或抽象类不依赖于实现类;③实现类依赖接口或抽象类。

依赖的三种写法:

①构造函数传递依赖对象(构造函数注入)

②Setter 方法传递依赖对象(setter 依赖注入)

③接口声明依赖对象(接口注入)

使用原则:

依赖倒置原则的本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此独

立,不互相影响,实现模块间的松耦合,我们怎么在项目中使用这个规则呢?只要

遵循以下的几个规则就可以:

①每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备

②变量的表面类型尽量是接口或者是抽象类

③任何类都不应该从具体类派生(只要不超过两层的继承是可以忍受的)

④尽量不要复写基类的方法

⑤结合里氏替换原则使用

●Open Closed Principle:开闭原则

定义:软件实体应该对扩展开放,对修改关闭。

其含义是说一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来

实现变化。

软件实体:项目或软件产品中按照一定的逻辑规则划分的模块、抽象和类、方法。

变化的三种类型:

①逻辑变化

只变化一个逻辑,而不涉及其他模块,比如原有的一个算法是 a*b+c,现在需要修

改为 a*b*c,可以通过修改原有类中的方法的方式来完成,前提条件是所有依赖或

关联类都按照相同的逻辑处理。

②子模块变化

一个模块变化,会对其他的模块产生影响,特别是一个低层次的模块变化必然引起

高层模块的变化,因此在通过扩展完成变化时,高层次的模块修改是必然的。

③可见视图变化

可见视图是提供给客户使用的界面,如 JSP 程序、Swing 界面等,该部分的变化

一般会引起连锁反应(特别是在国内做项目,做欧美的外包项目一般不会影响太

大)。可以通过扩展来完成变化,这要看我们原有的设计是否灵活。

有用请点赞,养成良好习惯!

疑问、交流、鼓励请留言!


猜你喜欢

转载自blog.csdn.net/libusi001/article/details/125055323