漫谈设计模式(三):桥接(Bridge)模式 —— 将类功能、结构两层次分离

1.前言

类主要有两个层次,一个是功能层次,另一个是实现层次。

功能层次,一般应用于当前类不能满足多样化的业务需求,让子类去继承(具体)父类,添加加一些父类中没有的功能(一般是增加新的方法),这就属于因增加新功能而产生的层次结构。

实现层次,一般常见于子类去继承抽象类或接口,将抽象类或接口中的抽象方法重写,抽象类(接口)只声明了方法,而具体任务的分担需要子类去分担。相当于,子类只是将父类宣传出的口号、吹出的牛逼给落实了,将分配的任务给真正去做了,但它并没有增加新功能,只是实现父类的抽象方法,这就是类的实现层次。

若这两个层次在同一个类中实现,这就会将两种层次结构混杂在一起,相互影响,耦合度高,不利后期拓展。桥接模式就是将这两种层次分开,分别在两个类中实现,某一个层次的修改不会影响到另一个层次的实现。

2.代码实现

1).先定义一普通的POJO实体类Product

import java.math.BigDecimal;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Setter
@Getter
@ToString
@NoArgsConstructor
public class Product {
	private Integer id;//产品id
	private String name;// 产品名
	private String description;// 描述
	private BigDecimal price;// 价格

	public Product(String name) {
		super();
		this.name = name;
	}
	public Product(BigDecimal price) {
		super();
		this.price = price;
	}
	public Product(Integer id, String name, String description) {
		super();
		this.id = id;
		this.name = name;
		this.description = description;
	}
	public Product(Integer id, String name, String description, BigDecimal price) {
		super();
		this.id = id;
		this.name = name;
		this.description = description;
		this.price = price;
	}
}

 

2).定义一个操作实体类Product的Dao层接口。这个接口有基本的增删改查的抽象方法。

import java.util.List;

public interface ProductDao {
	int addProduct(Product product);
	int deleteProduct(int productId);
	int modifyProduct(Product product);
	List<Product> findProducts(Product product);
}

  

3).增加实现

随着客户对数据库的需求的变化,整个软件生命周期后期可能不只使用一种数据库,可能要编写在不同数据库平台上进行数据持久化操作的ProductDao实现类

/**
 * 在Oracle数据库的实现
 * @author Administrator
 *
 */
public class ProductDaoOrancleImpl implements ProductDao {

    @Override
    public int addProduct(Product product) {
        System.out.println("在Orancle数据库中保存了一个产品"+product);
        return 1;
    }

    @Override
    public int deleteProduct(int productId) {
        System.out.println("在Orancle数据库中删除了一个产品,其id为"+productId);
        return 1;
    }

    @Override
    public int modifyProduct(Product product) {
        System.out.println("在Orancle数据库中修改了一个产品,修改后为"+product);
        return 1;
    }

    @Override
    public List<Product> findProducts(Product product) {
        Product p1=new Product(1, "洗衣机", "好用便宜的洗衣机");
        Product p2=new Product(2, "T恤", "透气清爽的T恤");
        System.out.println("从Orancle数据库中查询出的产品有:{"+p1+"},{"+p2+"}");
        return Arrays.asList(p1,p2);
    }

}

在Oracle数据库的实现

import java.util.Arrays;
import java.util.List;
/**
 * 在mysql数据库的实现
 * @author Administrator
 *
 */
public class ProductDaoMysqlImpl implements ProductDao{

    @Override
    public int addProduct(Product product) {
        System.out.println("在mysql数据库中保存了一个产品"+product);
        return 1;
    }

    @Override
    public int deleteProduct(int productId) {
        System.out.println("在mysql数据库中删除了一个产品,其id为"+productId);
        return 1;
    }

    @Override
    public int modifyProduct(Product product) {
        System.out.println("在mysql数据库中修改了一个产品,修改后为"+product);
        return 1;
    }

    @Override
    public List<Product> findProducts(Product product) {
        Product p1=new Product(1, "洗衣机", "好用便宜的洗衣机");
        Product p2=new Product(2, "T恤", "透气清爽的T恤");
        System.out.println("在mysql数据库中查询出的产品有:{"+p1+"},{"+p2+"}");
        return Arrays.asList(p1,p2);
    }
}

在mysql数据库的实现

4.编写一个实现桥接功能并抽象化的具体类

这个类的关键在于委托机制,委托成员变量productDao去完成实际业务处理。当然productDao一定是ProductDao接口的实现类的实例对象,因为接口不能实例化。这个成员变量productDao是完成桥接的关键,它将接口被实现的方法ProductDaoBridge的子类可能出现的拥有新功能的方法给连接在了一起。

import java.util.List;

public class ProductDaoBridge {
	//被final修饰,初始化后不能去引用其他ProductDao对象
	protected final ProductDao productDao;

	public ProductDaoBridge(ProductDao productDao) {
		super();
		this.productDao = productDao;
	}

	public int addProduct(Product product) {

		return productDao.addProduct(product);
	}

	int deleteProduct(int productId) {
		return productDao.deleteProduct(productId);
	}

	int modifyProduct(Product product) {
		return productDao.modifyProduct(product);

	}
	List<Product> findProducts(Product product){
		return productDao.findProducts(product);
	}
}

  

5).增加功能

业务处理中频繁要先查数据再进行删除,在子类中可以新增一个方法,将查删操作一并处理。

import java.util.List;

public class MultiProductDaoBridge extends ProductDaoBridge {

	public MultiProductDaoBridge(ProductDao productDao) {
		super(productDao);
	}

	/**
	 * 查出查询后,全部删除
	 *
	 * @param product 查询条件
	 */
	//final修饰防止被子类重写
	public final int[]  findProductThenDelete(Product product) {
		List<Product> products = this.productDao.findProducts(product);
		int[] delOks = new int[products.size()];
		for (int i = 0; i < products.size(); i++) {
			delOks[i] = productDao.deleteProduct(products.get(i).getId());
		}
		return delOks;
	}

}

  

原文地址:https://www.cnblogs.com/gocode/p/bridge-pattern.html

时间: 2024-10-10 07:05:49

漫谈设计模式(三):桥接(Bridge)模式 —— 将类功能、结构两层次分离的相关文章

C++设计模式实现--桥接(Bridge)模式

一. 举例 N年前: 计算机最先出来时,软件和硬件是一绑在一起的,比如IBM出了一台电脑,上面有一个定制的系统,假如叫 IBM_Win,这个IBM_Win系统当然不能在HP电脑上运行,同样HP出的HP_Win系统也不能运行在IBM上. 这时如果有一家新公司Apple出了一台新电脑,那么这个公司也要开发自己的系统 Apple_Win,Apple_Linux. 其实,上面几家公司开发的软件和硬件在很多地方都有相似之处,如果每家公司都做自己的系统,这意味着资源和人员的极大浪费. 这时,无论出现新的系统

Java 实现桥接(Bridge)模式

类图: /** * 手机壳.套 * @author stone * */ public abstract class BaseCellphoneShell { public abstract void mapping();//对应匹配哪种手机 } /** * 手机,桥接了 手机壳BaseCellphoneShell * @author stone */ public abstract class BaseCellphone { private BaseCellphoneShell shell;

设计模式三—抽象工厂模式

设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是园丁2的杰作 1.Fruit.java public interface Fruit { /* * 生长 * 收获 * 栽种 */ public void grow(); public void harvest(); public void plant(); } 2.Apple.java publi

设计模式--桥接(Bridge)模式

1.概述: 桥接模式:把抽象和行为分离开来,中间需要某个介质来连接抽象化和行为化.此模式的概述听起来非常像适配器模式,不要搞混了,虽然都是借用中间介质,但意义不同. 2.例子: 我们哪车子来打比方,比如:车有很多中类型(Bus,Jeep,taxi等),但每个车的引擎又不一样(有2000cc,2200cc)的:现在我们来造车,平常思维是根据车的配置来安装不同的引擎,而我们桥接模式的思维却是根据引擎来造车. 平常思维一: /** *造一个安装了引擎的车类接口 */ package com.msit.

Java经典23结构模型的设计模式(三)------附加代理模式、适配器型号、Facade模式的差异

本文介绍了7样的结构模型中的其余2种:轻量级.代理模式. 一.享元模式FlyWeight 享元模式比較简单且重要,在非常多场合都被用到.仅仅只是封装起来了用户看不到.其概念:运用共享内存技术最大限度的支持大量细粒度的对象. 这个概念给的有些抽象,说白了就是假设内存中存在某个对象A.假设再次须要使用对象A的时候假设内存中有A这个对象就直接使用它,不要再次new了.假设没有,则又一次new一个.基于这个特点,享元模式使用时通常会给待訪问对象传递一个Tag,用来标识这个对象,并且要同一时候使用抽象工厂

设计模式—三种工厂模式(JAVA)

一:简单工厂: 有一个实际工厂,这个工厂只能造一类的产品,这一类产品就是一个产品接口,会有多个具体产品实现这个接口,例 如,一个手机厂,生产苹果手机,三星手机: 缺点:在工厂类中集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中:对系统的维护和扩展不利: 使用场景:负责创建的对象比较少:客户只知道传入工厂类的参数,对于如何创建对象的逻辑不关心:容易违反高内聚责任分配原则,所以只在很简单的情况下应用: package com.designPattern.simp

再战设计模式(三)之建造者模式

建造者模式 他的本质主要是: 分离了组件的构造(由builder来负责),和装配(由Director负责),从而构造出复杂的对象,这个模式使用于:某个对象构建过程复杂的情况下使用 建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 由于实现了构建和装配的解耦.不同的构建器和不同的装配器 可以组合成很多不同的对象.也就是实现了构建算法.装配 算法的解耦,实现了更好的复用 场景: 在日常

php设计模式之责任链模式实现举报功能实例代码

html <html> <head> <meta charset="UTF-8"> <title>责任链模式</title> </head> <body> <h1>责任链模式举报</h1> <form action="09-2.php" method="post"> <select name="lev"

漫谈设计模式--3分钟理解桥接模式:笔和画的关系

其实不需要3分钟,3秒钟就够了,记住桥接模式就是如此简单:一句话,笔有千般形,画有万变化. 下面的仅仅助于理解. 1. 定义 The bridge pattern is a design pattern used in software engineering which is meant to "decouple an abstraction from its implementation so that the two can vary independently" From Wi