zoukankan      html  css  js  c++  java
  • 《设计模式六》构建器、适配器、命令模式

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

  • 相关阅读:
    5.14每日一题题解
    5.13 每日一题题解
    5.12 每日一题题解
    5.11 每日一题题解
    5.10每日一题题解
    【SPOJ -NSUBSTR】Substrings 【后缀自动机+dp】
    【POJ1509】Glass Beads 【后缀自动机】
    【codevs3160】 LCS 【后缀自动机】
    【HDU4734】F(x) 【数位dp】
    【hdu6148】Valley Numer【数位dp模板题】
  • 原文地址:https://www.cnblogs.com/darope/p/12737369.html
Copyright © 2011-2022 走看看