构建器、适配器、命令模式
1.14 构建器模式 - Builder
用于构建负责复杂对象,比如构建一个对象,需要传50个参数进去
例如我的世界中地形的类,用于构建一块地形,需要传入墙,草,陷阱等等许多参数,那么可以定义构建器接口,该接口有构建墙,构建草,构建陷阱,最后构建地形几个接口方法。每个接口把this返回,可以链式调用
public interface TerrainBuilder {
TerrainBuilder builderWall();
TerrainBuilder builderFort();
TerrainBuilder builderMine();
Terrain build();
}
TerrainBuilder builder = new ComplexTerrainBuilder();
Terrain t = builder.builderWall().builderFort().builderMine().build();
1.15 适配器模式-Adapter
当一个类无法直接访问另外一个类的时候,需要中间加一层转换,类似于转接头。
1.15.1 IO中对适配器的使用
public static void main(String[] args) {
FileInputStream fis = new FileInputStream("c:/test.txt");
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
String line = br.readLine();
while(line != null && !line.equels("")) {
System.out.println(line);
}
br.close();
}
解释:上面程序,读取文件,但是我们要按行读取,最好使用BufferedReader可以方便按行读取,但是BufferedReader接受的是Reader,所以需要先把Stream转换成Reader。这里的InputStreamReader就相当于转换器。也就是适配器
1.15.2 数据库中对适配器的使用
例如用Java访问SqlServer,SqlServer默认使用的是ODBC,Java的连接使用的是JDBC。通常的做法是使用JDBC-ODBC-Bridge,做一层适配,Java使用JDBC访问Bridge,Bridge使用ODBC访问SqlServer
误区:常见的Adapter反而不是使用的适配器模式,比如WindowAdapter和KeyAdapter,这两个什么设计模式都不是
1.16 桥接模式-Bridge(了解,用的不多)
分离抽象和具体
1.17 命令模式-Command
结合cor实现undo的功能
Command模式就是用来封装各种各样的命令的:
public abstract class Commond {
public abstract void doit();
public abstract void undo();
}
public class Content {
String msg = "hello world";
}
public class InsertCommand extends Command {
Contant c;
String strToInsert = "http://www.darope.com";
String strToInsert(Content c) {
this.c = c;
}
@Override
public void doit() {
c.msg = c.msg + strToInsert;
}
@Override
public void undo() {
c.msg = c.msg.substring(0,c.msg.length()-strToInsert.length());
}
}
所以Command经常被用来实现do和undo的功能,例如编辑器打字,使用crtl + z可以回退,就是一个do-undo的实现,可以回退。正常的编译器不止可以回退一次,一连串的undo也就是不停的ctrl+z可以使用Commond模式加上责任链模式来实现
Command也可以被用来处理事务,就是一连串的操作回滚,类似回退的Command的命令。可以用Command加上Prototype原型模式