[工作中的设计模式]桥接模式bridge
一、模式解析:
策略模式一节讲过,通过扩展持有者,使持有者形成抽象类,然后实现多个具体持有者,策略模式可以转化为桥接模式。
桥接模式定义为:将抽象部分与实现部分分离,使它们都可以独立的变化,在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,使用桥接模式可以应对多维度的变化。
主要有两个要点
1、有两个维度的变化,彼此的变化应该不会受到对方的干扰
2、通过接口进行关联,共有n*m种组合
3、其中一个维度,保存这另外一个维度的引用
二、模式代码:
维度一
interface Implementor {
public void operacitonImpl();
}
class ImplementorA implements Implementor{
@Override
public void operacitonImpl() {
System.out.println("ImplementorA的方法被执行");
}
}
class ImplementorB implements Implementor{
@Override
public void operacitonImpl() {
System.out.println("ImplementorB的方法被执行");
}
}
维度二、
抽象代码,保存了维度一的引用,并且可以通过人工设置
public abstract class Abstraction {
protected Implementor implementor;
public void setImplementor(Implementor implementor){
this.implementor=implementor;
}
public void operation(){};
}
public class RefinedAbstraction extends Abstraction {
@Override
public void operation() {
System.out.println("RefinedAbstraction被执行了");
implementor.operacitonImpl();
}
}
客户端代码:
执行维度二,通过维度二调用维度一
public class Client {
public static void main(String[] args) {
Abstraction abstraction=new RefinedAbstraction();
abstraction.setImplementor(new ImplementorA());
abstraction.operation();
}
}
三、应用场景
话接上一章策略模式,银行系统中转账不仅只有一种,比如有行内转账,跨行转账,二代支付等方式,每一种转账方式都需要计算手续费,因此在此我们将策略模式改造为桥接模式,因为手续费维度并没有变化,因此此处只需要修改转账维度
四,场景代码
定义转账接口,保留计算手续费接口
public abstract class ITransfer {
protected IFee feeImpl;
public void setIFee(IFee feeImpl){
this.feeImpl=feeImpl;
}
public abstract void execute();
}
行内转账方法
public class TransferIn extends ITransfer {
public void execute(){
System.out.println("跨行转账开始。。。。");
int fee=feeImpl.getFee();
System.out.println("手续费为:"+fee);
System.out.println("跨行转账完成。。。。");
}
}
跨行转账方法
public class TransferOut extends ITransfer {
public void execute(){
System.out.println("跨行转账开始。。。。");
int fee=feeImpl.getFee();
System.out.println("手续费为:"+fee);
System.out.println("跨行转账完成。。。。");
}
}
客户端调用,可能是网银,柜面等渠道
public class Client {
public static void main(String[] args) {
ITransfer transfer=new TransferOut();
transfer.setIFee(new FeeFromRemote());//项目中手续费计算方式通常由框架进行注入
transfer.execute();
}
}
执行结果
跨行转账开始。。。。
正在从核心获取手续费
手续费为:100
跨行转账完成。。。。
五、说明
实际使用过程中,并不会向Client中去初始化转账方法,然后直接设置手续费计算,通常转账作为一个路径资源进行访问,手续费计算方法通过spring的进行IOC注入
[工作中的设计模式]桥接模式bridge的更多相关文章
- 转:设计模式-----桥接模式(Bridge Pattern)
转自:http://www.cnblogs.com/houleixx/archive/2008/02/23/1078877.html 记得看原始链接的评论. 学习设计模式也有一段时间了,今天就把我整理 ...
- 设计模式 -- 桥接模式(Bridge)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 初始桥接模式 ...
- [工作中的设计模式]原型模式prototype
一.模式解析 提起prototype,最近看多了js相关的内容,第一印象首先是js的原型 var Person=function(name){ this.name=name; } Person.pro ...
- [工作中的设计模式]策略模式stategy
一.模式解析 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式的关键点为: 1.多种算法存在 2.算法继承同样的接口 ...
- 设计模式--桥接模式Bridge(结构型)
一.概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或者多个维度的变化,如何应对这种"多维度的变化",就可以利用桥接模式. 引例: 设想如果要绘制矩形.圆形.椭圆.正方形,我 ...
- [工作中的设计模式]解释器模式模式Interpreter
一.模式解析 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 以上是解释器模式的类图,事实上我 ...
- [工作中的设计模式]中介模式模式Mediator
一.模式解析 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 中介模式又叫调停者模式,他有如下特点: 1.有多个系统或者对 ...
- C#设计模式——桥接模式(Bridge Pattern)
一.概述在软件开发中,我们有时候会遇上一个对象具有多个变化维度.比如对汽车对象来说,可能存在不同的汽车类型,如公共汽车.轿车等,也可能存在不同的发动机,如汽油发动机.柴油发动机等.对这类对象,可应用桥 ...
- 大话设计模式--桥接模式 Bridge -- C++实现实例
1. 桥接模式: 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 分离是指 抽象类和它的派生类用来实现自己的对象分离. 实现系统可以有多角度分类,每一种分类都有可能变化,那么把这种多角度分离出 ...
随机推荐
- mybatis 的if else
<update id="update" parameterType="XXX"> update XX set YY ...
- NIS域配置详解
一.前期准备1.1 NIS 简介NIS,英文的全称是network information service,也叫yellow pages.在Linux中,NIS是一个基于RPC的client/serv ...
- IOS - 屏幕适配
原文:Beginning Auto Layout Tutorial in iOS 7: Part 1 感谢翻译小组成员@answer-huang(博客)热心翻译.如果您有不错的原创或译文,欢迎提交给我 ...
- Qt 获取cmd运行结果
http://www.cnblogs.com/gisbeginner/archive/2012/12/08/2809063.html BOOL ExecDosCmd(){ #define EXECDO ...
- 让div等块级元素水平以及垂直居中的解决办法
一.背景 我们在设计页面的时候,经常要把div等块级元素居中显示,而且是相对页面窗口水平和垂直方向居中显示,如让登录窗口居中显示.我们传统解决的办法是用纯CSS来让div等块级元素居中.在本文中,我将 ...
- 单击双击手势(UITapGestureRecognizer)
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...
- MD(markdown)语法
#标题1 ##标题2 段落->空行分隔 `加背景` [超链接](https://www.baidu.com) **加粗** _斜体_ ~~删除线~~ . 列表一 . 列表二 图片: ![alt ...
- Javascript 封装方法
基本封装方法 请看下面的例子: var Person = function(name,age){ this.name = name; this.age = age || "未填写" ...
- NYOJ之三个数从小到大排序
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsoAAAGvCAIAAADNJWRjAAAgAElEQVR4nO3dPXLqSrs24DMJcgbi1A
- 解决passwd 为普通用户设密码 不成功的方法
echo "xxxxxxxxx"|passwd --stdin user_name #这样设置密码就可以成功!