构建器、适配器、命令模式

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原型模式

posted @ 2020-04-20 13:54  x1aoda1  阅读(217)  评论(0编辑  收藏  举报