Bridge设计模式 + FilenameFilter总结

Bridge桥接设计模式是将一组功能(实现)与另一组使用该功能的其他对象(行为)分离开来,以便达到单一因素变化,然后使用对象调用的方式将这两组关联系起来,将问题的行为和实现分离开来实现,通过用聚合代替继承来解决子类爆炸性增长的问题。 Bridge桥接设计模式结构如下:


还是以画图为例演示Bridge桥接设计模式,例子代码如下:

  1. //行为  
  2. interface Shape{  
  3. public void doDraw();  
  4. }  
  5. class Circle implements Shape{  
  6.     private Drawing draw  
  7.     public Circle(Drawing draw){  
  8.     this.draw = draw;  
  9. }  
  10. public void doDraw(){  
  11.     draw.draw();  
  12. }  
  13. }  
  14. class Rectangle implements Shape{  
  15.     private Drawing draw  
  16.     public Rectangle(Drawing draw){  
  17.     this.draw = draw;  
  18. }  
  19. public void doDraw(){  
  20.     draw.draw();  
  21. }  
  22. }  
  23. //实现  
  24. interface Drawing{  
  25.     public void draw();  
  26. }  
  27. class SolidDrawing implements Drawing{  
  28.     public void draw(){  
  29.     System.out.println(“Drawing solide line…”);  
  30. }  
  31. }  
  32. class DashDrawing implements Drawing{  
  33.     public void draw(){  
  34.     System.out.println(“Drawing dash line…”);  
  35. }  
  36. }  
  37. public class BridgeDemo{  
  38.     public static void main(String[] args){  
  39.     //画一个实线的圆  
  40.     Drawing draw1 = new SolidDrawing();  
  41.     Shape shape1 = new Circle(draw1);  
  42.     shape1.doDraw();  
  43. //画一个虚线的矩形  
  44.     Drawing draw2 = new DashDrawing();  
  45.     Shape shape2 = new Rectangle(draw2);  
  46.     shape2.doDraw();  
  47. }  
  48. }  

只从上面的例子代码可能还无法完全理解Bridge桥接设计模式,上面的圆形和矩形是行为,而实线画法和虚线画法则是实现,行为接口Shape通过聚合方式引用实现接口Drawing从而达到了行为和实现的桥接。如果需要增加第三种图形三角形,则不会影响实现部分。如果增加第三种画法折线画法,则不会影响图形行为部分,将行为与实现松耦合分离。当系统有两个可变因素时,即问题行为和问题实现都在变化时,传统实现方式可能组合情况太多造成类爆炸,适合使用桥梁模式。

学习设计模式的人经常分不清Bridge桥接设计模式和Strategy策略设计模式,个人感觉两者简单的区别如下:

(1).Bridge桥接设计模式中不但实现可以变化,问题行为也是可以变化的,且两者的变化是相互独立的,在两个维度都存在变化情况下优先考虑使用桥接模式。

(2).Strategy策略设计模式中,仅仅存在算法实现策略的变化,问题行为是不变的,即仅有一个维度的变化。另外策略模式中考虑的算法层次的变化,是无状态,无数据的。


JDK中桥接模式的应用:

AWT
JDBC

一、FilenameFilter介绍


java.io.FilenameFilter是文件名过滤器,用来过滤不符合规格的文件名,并返回合格的文件;

一般地:

(1)String[] fs = f.list();

(2)File[] fs = f.listFiles();

这两个方法返回f下的所有文件或目录;

FilenameFilter用来把符合要求的文件或目录返回;

因此可以调用:

(1)String []fs = f.list(FilenameFilter filter);;

(2)File[]fs = f.listFiles(FilenameFilter filter);


二、文件名过滤器一般用法


1.实现FilenameFilter接口;

2.实现boolean accept(File dir,String name);   //dir表示文件的当前目录,name表示文件名;

class MyFilter implements FilenameFilter{

private String type;            //type为需要过滤的条件,比如如果type=".jpg",则只能返回后缀为jpg的文件

public MyFilter(String type){

this.type = type;

}

public boolean accept(File dir,String name){           //返回true的文件则合格

}

}


三、实例    


要求:返回当前目录下所有以.java结尾的文件;

  1. package org.exam5a;  
  2.   
  3. import java.io.File;  
  4. import java.io.FilenameFilter;  
  5.   
  6. public class T4 {  
  7.   
  8.     public static void main(String[] args)throws Exception {  
  9.         File f = new File(".");  
  10.         MyFilter filter = new MyFilter(".java");  
  11.         String[] files = f.list(filter);  
  12.         for(String a:files){  
  13.             System.out.println(a);  
  14.         }  
  15.     }  
  16.     static class MyFilter implements FilenameFilter{  
  17.         private String type;  
  18.         public MyFilter(String type){  
  19.             this.type = type;  
  20.         }  
  21.         public boolean accept(File dir,String name){  
  22.             return name.endsWith(type);  
  23.         }  
  24.     }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值