zoukankan      html  css  js  c++  java
  • 设计模式之建造者模式

    建造者模式

    1、已车辆模型为例,客户要求,车辆要求先启动、再鸣笛、再停止。

    分析:需要有个抽象车模吧,还要有具体车辆的实现类吧。编写测试类就能完成这一需求

    package gov.mof.fasp2.gcfr.adjustoffset.adjust;
    
    import java.util.ArrayList;
    
    /**
     * 车模抽象类
     * @author haokui
     *
     */
    abstract class CarModel {
        //存放执行顺序
        private ArrayList<String> seq = new ArrayList<String>();
         //启动
        abstract void start();
        
        //停止
        abstract void stop();
        
        //鸣笛
        abstract void alarm();
        void run() {
            for (String str : seq) {
                if ("start".equals(str)) {
                    this.start();
                    continue;
                }
                if ("stop".equals(str)) {
                    this.stop();
                    continue;
                }
                if ("alarm".equals(str)) {
                    this.alarm();
                    continue;
                }
            }
        }
        //设置顺序
        public void setSeq(ArrayList<String> seq) {
            this.seq = seq;
        }
    }
    /**
     * 奔驰模型
     * @author haokui
     *
     */
    class BenzModel extends CarModel{
    
        @Override
        void start() {
            System.out.println("奔驰启动。。。");
        }
    
        @Override
        void stop() {
            System.out.println("奔驰停止。。。");
            
        }
    
        @Override
        void alarm() {
            System.out.println("奔驰鸣笛。。。");
            
        }
        
    }
    /**
     * 宝马模型
     * @author haokui
     *
     */
    class BMWModel extends CarModel{
    
        @Override
        void start() {
            System.out.println("宝马启动。。。");
        }
    
        @Override
        void stop() {
            System.out.println("宝马停止。。。");
            
        }
    
        @Override
        void alarm() {
            System.out.println("宝马鸣笛。。。");
            
        }
    }
    /**
     * 测试场景类
     * @author haokui
     *
     */
    public  class Main {
        public static void main(String[] args) {
            BMWModel bmw = new BMWModel();
             ArrayList<String> seq = new ArrayList<String>();
             seq.add("start");
             seq.add("alarm");
             seq.add("stop");
             bmw.setSeq(seq);
             bmw.run();
        }
    }

    运行结果:

    宝马启动。。。
    宝马鸣笛。。。
    宝马停止。。。

    2、刚把这个写完,客户又说了,不想要这样的了,要求可以自己设置顺序,不一定是刚才的顺序。完了,傻脸了。得想办法满足客户需求啊,所以下面就是要用建造者模式去满足客户的需求。

    分析:抽象车模还是要有。但是给车辆模型建一个抽象建造者,宝马和奔驰各自编写一个建造者来实现车模建造者,他的作用就是设置宝马或者奔驰传递过来的顺序,和返回一个具体的车辆模型。

    package gov.mof.fasp2.gcfr.adjustoffset.adjust;
    
    import java.util.ArrayList;
    
    /**
     * 车模抽象类
     * @author haokui
     *
     */
    abstract class CarModel {
        //存放执行顺序
        private ArrayList<String> seq = new ArrayList<String>();
         //启动
        abstract void start();
        
        //停止
        abstract void stop();
        
        //鸣笛
        abstract void alarm();
        void run() {
            for (String str : seq) {
                if ("start".equals(str)) {
                    this.start();
                    continue;
                }
                if ("stop".equals(str)) {
                    this.stop();
                    continue;
                }
                if ("alarm".equals(str)) {
                    this.alarm();
                    continue;
                }
            }
        }
        //设置顺序
        public void setSeq(ArrayList<String> seq) {
            this.seq = seq;
        }
    }
    /**
     * 奔驰模型
     * @author haokui
     *
     */
    class BenzModel extends CarModel{
    
        @Override
        void start() {
            System.out.println("奔驰启动。。。");
        }
    
        @Override
        void stop() {
            System.out.println("奔驰停止。。。");
            
        }
    
        @Override
        void alarm() {
            System.out.println("奔驰鸣笛。。。");
            
        }
        
    }
    /**
     * 宝马模型
     * @author haokui
     *
     */
    class BMWModel extends CarModel{
    
        @Override
        void start() {
            System.out.println("宝马启动。。。");
        }
    
        @Override
        void stop() {
            System.out.println("宝马停止。。。");
            
        }
    
        @Override
        void alarm() {
            System.out.println("宝马鸣笛。。。");
            
        }
    }
    /**
     * 车辆模型建造者
     * @author haokui
     *
     */
    abstract class  CarBuild   {
        
        //返回车模
        public abstract CarModel getCarModel();
        
        //设置传递过来的顺序
        public abstract void setSeq(ArrayList<String> seq);
        
    }
    /**
     * 奔驰模型建造者
     * @author haokui
     *
     */
      class BenzBuild extends CarBuild {
        BenzModel b = new BenzModel();
        @Override
        public CarModel getCarModel() {
            return b;
        }
    
        @Override
        public void setSeq(ArrayList<String> seq) {
            this.b.setSeq(seq);
        }
        
    }
    /**
     * 宝马模型建造者
     * @author haokui
     *
     */
     class BMWBuild extends CarBuild {
        
         BMWModel b = new BMWModel();
        @Override
        public CarModel getCarModel() {
            return b;
        }
    
        @Override
        public void setSeq(ArrayList<String> seq) {
            this.b.setSeq(seq);
        }
        
    }
    
    /**
     * 测试场景类
     * @author haokui
     *
     */
    public  class Main {
        public static void main(String[] args) {
            //定义一个顺序
             ArrayList<String> seq = new ArrayList<String>();
             seq.add("start");
             seq.add("alarm");
             seq.add("stop");
             
             //创建奔驰建造者
             BenzBuild b = new BenzBuild();
             b.setSeq(seq);
             BenzModel benz = (BenzModel) b.getCarModel();
             benz.run();
             
             //按照同样的顺序,再要一个宝马
             BMWBuild bmw = new BMWBuild();
             bmw.setSeq(seq);
             BMWModel bmwmodel = (BMWModel) bmw.getCarModel();
             bmwmodel.run();
        }
    }

    运行结果:

    奔驰启动。。。
    奔驰鸣笛。。。
    奔驰停止。。。
    宝马启动。。。
    宝马鸣笛。。。
    宝马停止。。。

    同理,再要一个奥迪也是一样,这样的话就不要直接去访问产品类了,直接把顺序传递给建造者,然后获取车模,拿到模型,再去运行,代码会简便很多。

  • 相关阅读:
    android 项目学习随笔十五(ShareSDK开放平台)
    android 项目学习随笔十四(WebView)
    android 项目学习随笔十三(ListView实现ITEM点击事件,将已读状态持久化到本地)
    android 项目学习随笔十二(ListView加脚布局)
    android 项目学习随笔十一(ListView下拉刷新提示)
    android 项目学习随笔十(自定义ProgressBar)
    android 项目学习随笔九(ListView加头布局)
    android 项目学习随笔八(xUtils的BitmapUtils模块)
    android 项目学习随笔七(ViewPagerIndicator与ViewPager)
    android 项目学习随笔六(网络缓存)
  • 原文地址:https://www.cnblogs.com/hkdpp/p/9101154.html
Copyright © 2011-2022 走看看