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

  • 相关阅读:
    Codeforces 385 D Bear and Floodlight
    Linux经常使用的命令(两)
    hadoop编程技巧(6)---处理大量的小型数据文件CombineFileInputFormat申请书
    android Notification分析—— 您可能会遇到各种问题
    人类探索地外文明的显著取得的进展
    腰带“兄弟”事实上,投资
    C++机器学习古典材料
    [Recompose] Render Nothing in Place of a Component using Recompose
    [Recompose] Replace a Component with Non-Optimal States using Recompose
    [Recompose] Show a Spinner While a Component is Loading using Recompose
  • 原文地址:https://www.cnblogs.com/darope/p/12737369.html
Copyright © 2011-2022 走看看