读书笔记_java设计模式深入研究 第六章 桥接模式

1,桥接模式:将抽象部分与实现部分分离,使他们可以独立变化。桥接模式可以实现的是不同方式的组合完成不同的功能,方式和功能完全分离,使得相互不影响。

2,UML模型:

3,简单代码实例:

  1. /**
  2. *
  3. * @(#) IPost.java
  4. * @Package pattern.chp06.bridge.simple
  5. *
  6. * Copyright ? JING Corporation. All rights reserved.
  7. *
  8. */
  9. package pattern.chp06.bridge.simple;
  10. /**
  11. * 类描述:邮局接口类
  12. *
  13. * @author: Jing
  14. * @version $Id: Exp$
  15. *
  16. * History: Dec 23, 2014 3:08:36 PM Jing Created.
  17. *
  18. */
  19. public interface IPost {
  20. /**
  21. *
  22. * 方法说明:发送功能
  23. *
  24. * Author: Jing Create Date: Dec 23, 2014 3:08:57 PM
  25. *
  26. * @return void
  27. */
  28. public void post();
  29. }
  1. /**
  2. *
  3. * @(#) MarkPost.java
  4. * @Package pattern.chp06.bridge.simple
  5. *
  6. * Copyright ? JING Corporation. All rights reserved.
  7. *
  8. */
  9. package pattern.chp06.bridge.simple;
  10. /**
  11. * 类描述:挂号信
  12. *
  13. * @author: Jing
  14. * @version $Id: Exp$
  15. *
  16. * History: Dec 23, 2014 3:19:32 PM Jing Created.
  17. *
  18. */
  19. public class MarkPost implements IPost{
  20. public void post() {
  21. System.out.println("This is MarkPost");
  22. }
  23. }
  1. /**
  2. *
  3. * @(#) SimplePost.java
  4. * @Package pattern.chp06.bridge.simple
  5. *
  6. * Copyright ? JING Corporation. All rights reserved.
  7. *
  8. */
  9. package pattern.chp06.bridge.simple;
  10. /**
  11. * 类描述:平信邮局
  12. *
  13. * @author: Jing
  14. * @version $Id: Exp$
  15. *
  16. * History: Dec 23, 2014 3:18:39 PM Jing Created.
  17. *
  18. */
  19. public class SimplePost implements IPost{
  20. public void post() {
  21. System.out.println("This is SimplePost");
  22. }
  23. }
  1. /**
  2. *
  3. * @(#) AbstractThing.java
  4. * @Package pattern.chp06.bridge.simple
  5. *
  6. * Copyright ? JING Corporation. All rights reserved.
  7. *
  8. */
  9. package pattern.chp06.bridge.simple;
  10. /**
  11. * 类描述:抽象事物
  12. *
  13. * @author: Jing
  14. * @version $Id: Exp$
  15. *
  16. * History: Dec 23, 2014 3:20:37 PM Jing Created.
  17. *
  18. */
  19. public abstract class AbstractThing {
  20. private IPost post;
  21. public AbstractThing(IPost post) {
  22. this.post = post;
  23. }
  24. public void post(){
  25. post.post();
  26. }
  27. }
  1. /**
  2. *
  3. * @(#) Lettle.java
  4. * @Package pattern.chp06.bridge.simple
  5. *
  6. * Copyright ? JING Corporation. All rights reserved.
  7. *
  8. */
  9. package pattern.chp06.bridge.simple;
  10. /**
  11. * 类描述:普通信件
  12. *
  13. * @author: Jing
  14. * @version $Id: Exp$
  15. *
  16. * History: Dec 23, 2014 3:21:36 PM Jing Created.
  17. *
  18. */
  19. public class Letter extends AbstractThing{
  20. public Letter(IPost post) {
  21. super(post);
  22. }
  23. }
  1. /**
  2. *
  3. * @(#) Parcel.java
  4. * @Package pattern.chp06.bridge.simple
  5. *
  6. * Copyright ? JING Corporation. All rights reserved.
  7. *
  8. */
  9. package pattern.chp06.bridge.simple;
  10. /**
  11. * 类描述:挂号
  12. *
  13. * @author: Jing
  14. * @version $Id: Exp$
  15. *
  16. * History: Dec 23, 2014 3:22:31 PM Jing Created.
  17. *
  18. */
  19. public class Parcel extends AbstractThing {
  20. public Parcel(IPost post) {
  21. super(post);
  22. }
  23. }
  1. /**
  2. *
  3. * @(#) MainTest.java
  4. * @Package pattern.chp06.bridge.simple
  5. *
  6. * Copyright ? JING Corporation. All rights reserved.
  7. *
  8. */
  9. package pattern.chp06.bridge.simple;
  10. import org.junit.Test;
  11. /**
  12. * 类描述:
  13. *
  14. * @author: Jing
  15. * @version $Id: Exp$
  16. *
  17. * History: Dec 23, 2014 3:23:16 PM Jing Created.
  18. *
  19. */
  20. public class MainTest {
  21. @Test
  22. public void testMain() throws Exception {
  23. IPost post = new SimplePost();
  24. Letter letter = new Letter(post);
  25. letter.post();
  26. }
  27. }

4,深入理解桥接模式

-1,桥接模式强调 包含 替代  继承

这种方式,但对于功能和事物来说两者分离,不会相互影响。

-2,JDK中桥接模式:Collectios.sort方法,借助Arrays.sort方法实现其自身内部的排序。

5,应用

实现读取本地或者远程URL文件,文件类型是文本或图像文件。

分析:

基本到手后实现的思路会如下所示,在TextRead中判断是本地还是URL方法,在其中调用不同的流读写。

但是,当文件类型增多时,会实现多个子类重写,同时会破坏原有方法,需要改进原有方法。我们可以对功能方法进行复杂的拆分,如下UML

代码如下:

  1. /**
  2. *
  3. * @(#) Iread.java
  4. * @Package pattern.chp06.bridge.read
  5. *
  6. * Copyright ? JING Corporation. All rights reserved.
  7. *
  8. */
  9. package pattern.chp06.bridge.read;
  10. /**
  11. * 类描述:抽象功能类
  12. *
  13. * @author: Jing
  14. * @version $Id: Exp$
  15. *
  16. * History: Dec 24, 2014 9:41:15 AM Jing Created.
  17. *
  18. */
  19. public interface IRead<T> {
  20. /**
  21. *
  22. * 方法说明:文件读取
  23. *
  24. * Author: Jing
  25. * Create Date: Dec 24, 2014 10:52:28 AM
  26. *
  27. * @return
  28. * @throws Exception
  29. * @return T
  30. */
  31. T read() throws Exception;
  32. }
  1. /**
  2. *
  3. * @(#) TextRead.java
  4. * @Package pattern.chp06.bridge.read
  5. *
  6. * Copyright ? JING Corporation. All rights reserved.
  7. *
  8. */
  9. package pattern.chp06.bridge.read;
  10. /**
  11. * 类描述:文本读取
  12. *
  13. * @author: Jing
  14. * @version $Id: Exp$
  15. *
  16. * History: Dec 24, 2014 10:04:08 AM Jing Created.
  17. *
  18. */
  19. public class TextRead implements IRead<String> {
  20. AbstractStream stream;
  21. public TextRead(AbstractStream stream) {
  22. this.stream = stream;
  23. }
  24. /**
  25. * 读取文本文件
  26. */
  27. public String read() throws Exception {
  28. byte[] buf = stream.readBytes();
  29. String s = new String(buf);
  30. return s;
  31. }
  32. }
  1. /**
  2. *
  3. * @(#) ImgRead.java
  4. * @Package pattern.chp06.bridge.read
  5. *
  6. * Copyright ? JING Corporation. All rights reserved.
  7. *
  8. */
  9. package pattern.chp06.bridge.read;
  10. /**
  11. * 类描述:读取图像文件
  12. *
  13. * @author: Jing
  14. * @version $Id: Exp$
  15. *
  16. * History: Dec 24, 2014 10:51:58 AM Jing Created.
  17. *
  18. */
  19. public class ImgRead implements IRead<byte[]> {
  20. AbstractStream stream;
  21. public ImgRead(AbstractStream stream) {
  22. this.stream = stream;
  23. }
  24. public byte[] read() throws Exception {
  25. return stream.readBytes();
  26. }
  27. }
  1. /**
  2. *
  3. * @(#) AbstractStream.java
  4. * @Package pattern.chp06.bridge.read
  5. *
  6. * Copyright ? JING Corporation. All rights reserved.
  7. *
  8. */
  9. package pattern.chp06.bridge.read;
  10. import java.io.InputStream;
  11. /**
  12. * 类描述:抽象基类流
  13. *
  14. * @author: Jing
  15. * @version $Id: Exp$
  16. *
  17. * History: Dec 24, 2014 10:05:54 AM Jing Created.
  18. *
  19. */
  20. public class AbstractStream {
  21. protected InputStream in;
  22. protected int size;
  23. /**
  24. *
  25. * 方法说明:读取对应输入流
  26. *
  27. * Author: Jing Create Date: Dec 24, 2014 10:11:00 AM
  28. *
  29. * @return
  30. * @throws Exception
  31. * @return byte[]
  32. */
  33. protected byte[] readBytes() throws Exception {
  34. byte[] buf = new byte[size];
  35. in.read(buf);
  36. return buf;
  37. }
  38. /**
  39. *
  40. * 方法说明:关闭输入流
  41. *
  42. * Author: Jing Create Date: Dec 24, 2014 10:11:24 AM
  43. *
  44. * @throws Exception
  45. * @return void
  46. */
  47. public void close() throws Exception {
  48. in.close();
  49. }
  50. }
  1. /**
  2. *
  3. * @(#) NativeStream.java
  4. * @Package pattern.chp06.bridge.read
  5. *
  6. * Copyright ? JING Corporation. All rights reserved.
  7. *
  8. */
  9. package pattern.chp06.bridge.read;
  10. import java.io.File;
  11. import java.io.FileInputStream;
  12. /**
  13. * 类描述:本地文件流读取
  14. *
  15. * @author: Jing
  16. * @version $Id: Exp$
  17. *
  18. * History: Dec 24, 2014 10:21:53 AM Jing Created.
  19. *
  20. */
  21. public class NativeStream extends AbstractStream{
  22. public NativeStream(String fileName) throws Exception{
  23. File f = new File(fileName);
  24. size = (int) f.length();
  25. in = new FileInputStream(f);
  26. }
  27. }
  1. /**
  2. *
  3. * @(#) URLStream.java
  4. * @Package pattern.chp06.bridge.read
  5. *
  6. * Copyright ? JING Corporation. All rights reserved.
  7. *
  8. */
  9. package pattern.chp06.bridge.read;
  10. import java.net.HttpURLConnection;
  11. import java.net.URL;
  12. /**
  13. * 类描述:URl文件读取
  14. *
  15. * @author: Jing
  16. * @version $Id: Exp$
  17. *
  18. * History: Dec 24, 2014 10:27:09 AM Jing Created.
  19. *
  20. */
  21. public class URLStream extends AbstractStream {
  22. public URLStream(String fileName) throws Exception{
  23. URL url = new URL(fileName);
  24. in = url.openStream();
  25. HttpURLConnection urlCon = (HttpURLConnection) url.openConnection();
  26. size = urlCon.getContentLength();
  27. }
  28. }
  1. /**
  2. *
  3. * @(#) AbstractThing.java
  4. * @Package pattern.chp06.bridge.read
  5. *
  6. * Copyright ? JING Corporation. All rights reserved.
  7. *
  8. */
  9. package pattern.chp06.bridge.read;
  10. /**
  11. * 类描述:抽象事务类
  12. *
  13. * @author: Jing
  14. * @version $Id: Exp$
  15. *
  16. * History: Dec 24, 2014 10:54:09 AM Jing Created.
  17. *
  18. */
  19. public abstract class AbstractThing {
  20. IRead<?> read;
  21. public AbstractThing(IRead<?> read) {
  22. this.read = read;
  23. }
  24. Object read() throws Exception{
  25. return read.read();
  26. }
  27. }
  1. /**
  2. *
  3. * @(#) NativeFile.java
  4. * @Package pattern.chp06.bridge.read
  5. *
  6. * Copyright ? JING Corporation. All rights reserved.
  7. *
  8. */
  9. package pattern.chp06.bridge.read;
  10. /**
  11. * 类描述:本地文件读取
  12. *
  13. * @author: Jing
  14. * @version $Id: Exp$
  15. *
  16. * History: Dec 24, 2014 10:55:59 AM Jing Created.
  17. *
  18. */
  19. public class NativeFile extends AbstractThing{
  20. public NativeFile(IRead<?> read) {
  21. super(read);
  22. }
  23. }
  1. /**
  2. *
  3. * @(#) URLFile.java
  4. * @Package pattern.chp06.bridge.read
  5. *
  6. * Copyright ? JING Corporation. All rights reserved.
  7. *
  8. */
  9. package pattern.chp06.bridge.read;
  10. /**
  11. * 类描述:URL文件读取
  12. *
  13. * @author: Jing
  14. * @version $Id: Exp$
  15. *
  16. * History: Dec 24, 2014 10:56:43 AM Jing Created.
  17. *
  18. */
  19. public class URLFile extends AbstractThing {
  20. public URLFile(IRead<?> read) {
  21. super(read);
  22. }
  23. }
  1. /**
  2. *
  3. * @(#) Main.java
  4. * @Package pattern.chp06.bridge.read
  5. *
  6. * Copyright ? JING Corporation. All rights reserved.
  7. *
  8. */
  9. package pattern.chp06.bridge.read;
  10. /**
  11. * 类描述:
  12. *
  13. * @author: Jing
  14. * @version $Id: Exp$
  15. *
  16. * History: Dec 24, 2014 11:14:31 AM Jing Created.
  17. *
  18. */
  19. public class Main {
  20. public static void main(String[] args) throws Exception {
  21. //打开远程文件
  22. AbstractStream in = new URLStream("http://js.t.sinajs.cn/t6/webim_prime/js/webim.js?v=1419389776378");
  23. TextRead textRead = new TextRead(in);
  24. AbstractThing thing = new URLFile(textRead);
  25. String s = (String) thing.read();
  26. in.close();
  27. System.out.println(s);
  28. }
  29. }
时间: 2024-11-03 05:21:22

读书笔记_java设计模式深入研究 第六章 桥接模式的相关文章

读书笔记_java设计模式深入研究 第七章 代理模式 Proxy

1,代理模式:一个类可以用作其他东西的接口,其他类可以通过此类去访问被代理者. 2,UML图如下: 3,角色: ISubject:抽象主题接口,该接口定义对象和它的代理共用的接口. RealSubject:真实主题角色,使实现抽象主题接口的类. Proxy:代理角色,内部含有对真实对象的引用,从而可以操作真实对象,代理对象提供与真实对象相同的接口,以便在任何时候都可以替代真实对象. 4,简单代码: package pattern.chp07.proxy;   /** * 类描述:抽象主题接口 *

读书笔记_java设计模式深入研究 第三章 工厂模式 Factory

1,简单工厂 -1,定制抽象接口. -2,定制具体子类. -3,定制工厂类,通过工厂类的静态方法返回不同的子类对象. package pattern.chp02.facroty; /**  *  类描述:汽车接口  *   *  @author:  Jing  *  @version  $Id: Exp$   *  *  History:  Dec 18, 2014 10:50:10 AM   Jing   Created.  *             */ public interface 

读书笔记_java设计模式深入研究 第五章 观察者模式 Observer

1,观察者模式适合解决多种对象跟踪一个对象数据变化的程序结构问题,一个称作"主题"的对象和若干个称作"观察者"的对象.在主题对象更新后会通知所有的观察者,使他们自动更新自己. 2,观察者UML类图: 3,角色解释: -1,抽象观察者(IObserver):为所有具体观察者定义接口,在得到主题通知的时候,更新观察者自身数据. -2,抽象主题(ISubject):使用数组引用维护一组观察者对象,可以增加和删除观察者,同时同志观察者自身的改变. -3,观察者(Observ

读书笔记_java设计模式深入研究 第二章 反射

1,JDK中反射类包含的内容: -1,Class类,代表一个类. -2,Constructor,代表类的构造方法. -3,Field,代表类成员 -4,Method,代表方法. 2,统一调用形式: 一个基本的使用反射的例子如下: package com.use; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class A 

读书笔记_java设计模式深入研究 第九章 访问者模式 Vistor

1,访问者模式的目的是封装一些施加于某种数据结构元素之上的操作,一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变.为不同类型的元素提供多种访问操作方式,且可以在不修改原有系统的情况下增加新的操作方式,这就是访问者模式的动机. 2,UML图: 3,访问者角色: IElement:抽象的事物元素功能接口,定义了固定功能方法以及可变功能方法接口. Element:具体功能的实现类. IVisitor:访问者接口,为所有访问者对象声明一个visit方法,用来代表为对象结构添加的功能,原则上可

读书笔记_java设计模式深入研究 第十章 命令模式 Command

1,命令模式:主要针对需要执行的任务或用户提出的请求进行封装与抽象.抽象的命令接口描述了任务或请求的共同特征,而实现交由不同的具体命令对象完成.每个命令对象都是相互独立的,它负责完成需要执行的任务,却并不关心是谁调用的. 2,UML模型: 3,角色分析: -1,ICommander:抽象命令者,是一个接口,规定了用来封装请求的若干个方法. -2,ConcreteCommander:具体命令发送者,即命令源.实现命令接口. -3,Invoke:请求者,具体命令的管理和维护类.请求者是包含一个"命令

【读书笔记】C#高级编程 第六章 数组

(一)同一类型和不同类型的多个对象 如果需要使用同一类型的多个对象,就可以使用数组或集合(后面章讲). 如果需要使用不同类型的多个对象,可以使用Tuple(元组)类型. (二)简单数组 如果需要使用同一类型的多个对象,可以使用数组.数组是一种结构,它可以包含同一类型的多个元素. 1.数组的声明 在声明数组时,应先定义数组总元素的类型,其后是一堆空方括号和一个变量名. 例子: 以下代码声明了一个包含整形类型的数组 int[] intArray; 2.数组的初始化 声明了数组后,就必须为数组分配内存

R in action读书笔记(22)第十六章 高级图形进阶(下)

16.2.4 图形参数 在lattice图形中,lattice函数默认的图形参数包含在一个很大的列表对象中,你可通过trellis.par.get()函数来获取,并用trellis.par.set()函数来修改.show.settings()函数可展示当前的图形参数设置情况.查看当前的默认设置,并将它们存储到一个mysettings列表中: > show.settings() > mysettings<-trellis.par.get() 查看叠加点的默认设置值: > mysett

R in action读书笔记(21)第十六章 高级图形进阶(上)

16.1 R 中的四种图形系统 基础图形函数可自动调用,而grid和lattice函数的调用必须要加载相应的包(如library(lattice)).要调用ggplot2函数需下载并安装该包(install.packages("ggplot2")),第一次使用前还要进行加载(library(ggplot2)). 16.2 lattice 包 lattice包为单变量和多变量数据的可视化提供了一个全面的图形系统.在一个或多个其他变量的条件下,栅栏图形展示某个变量的分布或与其他变量间的关系