js常用设计模式实现三建造者模式

创建型模式创建型模式是对一个类的实例化过程进行了抽象,把对象的创建和对象的使用进行了分离关于创建型模式,已经接近尾声了,还剩下建造者模式和原型模式,这一篇说一说建造者模式 建造者模式的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。很官方哈,举个例子,就拿他的名字来说,建房子,你尽管告诉开发商,我有钱我要一个这样的房子,然后开发商就会去找到工人,然后进行一些列的工作,最后工人干完之后,你住进去了,不关心过程,只要结果就是建造者模式 总之建造者模式就是通过一步步构建多个组成部分,直到构建一个对象 建造者模式实现根据上边的例子来实现一下建造者 首先你的需求就是你需要一个你想要的房子,那么你肯定不能自己去建造,首先你会找到开发商 /** * @author: 周靖松 * @information: 开发商 * @Date: 2019-07-14 10:11:54 */ class Developer { constructor() { this.need = ['卧室', '厨房', '客厅']; console.log("我需要这样的房间"); } construct() { console.log("开始建造"); let workerOk=this.need.map(el=>{ let builder = new CreatDiagram(); builder.build(el); return builder.getResult(); }) console.log("房子不错"); console.log(workerOk); } } // 要求产品 let home = new Developer(); // 生成产品 home.construct();这是最终的目的,在我们new这个开发商类的时候,我们告诉他我们需要什么样的房子,需要有什么,然后开发商也不是自己去建造,他需要一个设计图,并且需要一些工人来帮助他实现建造 /** * @author: 周靖松 * @information: 设计图抽象类 * @Date: 2019-07-14 10:11:10 */ class Diagram { constructor() { console.log('拿到图纸') } build(partName) { console.log(`观察${partName}图纸`); } } /** * @author: 周靖松 * @information: 设计图实现 * @Date: 2019-07-14 10:11:25 */ class CreatDiagram extends Diagram { constructor() { super(); } build(partName) { super.build(partName); console.log(`建造开始${partName}`); this.worker = new worker(partName); } getResult() { console.log('完工'); return this.worker; } } ok 设计图到手,开始招人干活 ...

July 14, 2019 · 2 min · jiezi

封装一个通用的PopupWindow

上篇文章是关于建造者设计模式的,今天顺便封装一个通用的 PopupWindow 来实践一下, 同时也方便以后使用 PopupWindow,本文将从下面几个方面来介绍 PopupWindow 及其封装,具体如下: 概述常用方法基本使用封装 PopupWindow使用封装后的PopupWindow显示效果概述PopupWindow 表示一个弹窗,类似于 AlertDialog,相较 AlertDialog 来说 PopupWindow 使用起来更灵活,可有任意指定要显示的位置,当然能够灵活的使用必然在某一层面有所牺牲,如 PopupWindow 相较 AlertDialog 没有默认的布局,每次都得专门创建弹窗的布局,这一点来说 AlertDialog 就比较方便了,所以在开发中没有最好的解决方案,要根据具体的需求选择最合适的解决方案。 常用设置PopupWindow 的创建,具体如下: //构造方法 public PopupWindow (Context context) public PopupWindow(View contentView) public PopupWindow(View contentView, int width, int height) public PopupWindow(View contentView, int width, int height, boolean focusable) PopupWindow 的常用属性设置,具体如下: //设置View(必须) window.setContentView(contentView); //设置宽(必须) window.setWidth(WindowManager.LayoutParams.MATCH_PARENT); //设置高(必须) window.setHeight(WindowManager.LayoutParams.WRAP_CONTENT); //设置背景 window.setBackgroundDrawable(new ColorDrawable(Color.GRAY)); //设置PopupWindow之外的触摸事件 window.setOutsideTouchable(true); //设置PopupWindow消失的监听器 window.setOnDismissListener(this); //设置PopupWindow上的触摸事件 window.setTouchable(true); //设置PopupWindow弹出动画 window.setAnimationStyle(R.style.PopupWindowTranslateTheme);PopupWindow 的显示有两种设置方式,一种是基于坐标,另一种是基于某个 View ,具体如下: ...

June 1, 2019 · 3 min · jiezi

设计模式之建造者设计模式

这是设计模式系列的第二篇——建造者设计模式,我希望推送的文章是一个系列的,尽量保持一样的写作风格,尽量把我理解的阐述清楚,关于建造者设计模式主要从以下几个方面来学习,具体如下: 概述本质关键概念具体实现总结概述建造者设计模式(Builder Pattern)属于创建型设计模式,主要用于创建复杂的对象,可将复杂对象的构建过程抽象出来,通过不同实现的构建者和装配者最终组装出不同的对象,可以非常方便的增加不同实现的构建者、组装者而不用修改以前的代码。 本质建造者设计模式(Builder Pattern)分离了对象子组件的构造过程和组装过程,实现了构建与组装的解耦,不同的构建器相同的组装顺序以及相同的构建器不同的组装顺序都可以创建出不同的对象,使得构建与组装充分解耦,进而实现构建算法与组装算法的解耦,从而实现更好的复用。 关键概念构建者(Builder):构建不同的子组件且返回子组件或者提供获取复杂对象的方法,将构建过程抽象成接口或抽象类,方便扩展具体的不同的构建者。组装者(Dirctor):通过某个具体的构建者构建相关的子组件,同时对外提供组成复杂产品对象的方法。当需要生成复杂对象时,直接通过某个具体的组装者获得想要的具体对象即可,至于组装过程与构建过程使用者不需要关心,分别由具体的组装者与具体的构建者内部完成。当然复杂对象可以理解为具有很多属性的对象。 具体实现下面以手机的组装过程来说明建造者设计模式的具体实现,产品类如下: /** * 产品 * @author jzman */public class Phone { private Screen screen; private Camera camera; private Cpu cpu; //省略getter、setter、toString 方法 //...}//子组件class Screen{ private String name; //...}//子组件class Camera{ private String name; //...}//子组件class Cpu{ private String name; //...}抽象的构建者: /** * 构建者 * @author jzman */public interface PhoneBuilder { Screen builderScreen(); Camera builderCamera(); Cpu builderCpu();}具体的构建者: /** * 具体的构建者 * @author jzman */public class MiPhoneBuilder implements PhoneBuilder{ @Override public Screen builderScreen() { System.out.println("构建屏幕..."); return new Screen("Mi-screen"); } @Override public Camera builderCamera() { System.out.println("构建相机..."); return new Camera("Mi-camera"); } @Override public Cpu builderCpu() { System.out.println("构建屏幕..."); return new Cpu("Mi-cpu"); }}抽象的组装者: ...

May 31, 2019 · 1 min · jiezi

PHP面试常考之设计模式——建造者模式

你好,是我琉忆,PHP程序员面试笔试系列图书的作者。本周(2019.3.11至3.15)的一三五更新的文章如下:周一:PHP面试常考之设计模式——工厂模式周三:PHP面试常考之设计模式——建造者模式周五:PHP面试常考之设计模式——策略模式自己整理了一篇“什么是观察者模式?”的文章,关注公众号:“琉忆编程库”,回复:“观察”,我发给你。以下内容如需转载,请注明作者和出处。建造者模式介绍建造者模式又名生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。例如,一辆汽车由轮子,发动机以及其他零件组成,对于普通人而言,我们使用的只是一辆完整的车,这时,我们需要加入一个构造者,让他帮我们把这些组件按序组装成为一辆完整的车。UML图UML图说明Builder:抽象构造者类,为创建一个Product对象的各个部件指定抽象接口。ConcreteBuilder:具体构造者类,实现Builder的接口以构造和装配该产品的各个部件。定义并明确它所创建的表示。提供一个检索产品的接口Director:指挥者,构造一个使用Builder接口的对象。Product:表示被构造的复杂对象。ConcreateBuilder创建该产品的内部表示并定义它的装配过程。包含定义组成部件的类,包括将这些部件装配成最终产品的接口。实现示例<?php /*** chouxiang builer*/abstract class Builder{ protected $car; abstract public function buildPartA(); abstract public function buildPartB(); abstract public function buildPartC(); abstract public function getResult();}class CarBuilder extends Builder{ function __construct() { $this->car = new Car(); } public function buildPartA(){ $this->car->setPartA(‘发动机’); } public function buildPartB(){ $this->car->setPartB(‘轮子’); } public function buildPartC(){ $this->car->setPartC(‘其他零件’); } public function getResult(){ return $this->car; }}class Car{ protected $partA; protected $partB; protected $partC; public function setPartA($str){ $this->partA = $str; } public function setPartB($str){ $this->partB = $str; } public function setPartC($str){ $this->partC = $str; } public function show() { echo “这辆车由:”.$this->partA.’,’.$this->partB.’,和’.$this->partC.‘组成’; }}class Director{ public $myBuilder; public function startBuild() { $this->myBuilder->buildPartA(); $this->myBuilder->buildPartB(); $this->myBuilder->buildPartC(); return $this->myBuilder->getResult(); } public function setBuilder(Builder $builder) { $this->myBuilder = $builder; }}$carBuilder = new CarBuilder();$director = new Director();$director->setBuilder($carBuilder);$newCar = $director->startBuild();$newCar->show();?>自己整理了一篇“什么是观察者模式?”的文章,关注公众号:“琉忆编程库”,回复:“观察”,我发给你。自己编写的《PHP程序员面试笔试宝典》和《PHP程序员面试笔试真题解析》书籍,已在各大电商平台销售。书籍在手,offer我有。更多PHP相关的面试知识、考题可以关注公众号获取:琉忆编程库对本文有什么问题或建议都可以进行留言,我将不断完善追求极致,感谢你们的支持。 ...

March 13, 2019 · 1 min · jiezi

创建型模式:建造者模式

个人公众号原文:创建型模式:建造者模式五大创建型模式之四:建造者模式。简介姓名 :建造者模式英文名 :Builder Pattern价值观 :专治丢三落四个人介绍 :Separate the construction of a complex object from its representation so that the same construction process can create different representations.将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。(来自《设计模式之禅》)今天给大家介绍的是建造者模式。建造者模式的使用场景是:创建复杂的对象。什么才能算复杂对象?如果一个对象只需要通过 new XXX() 的方式创建,那就算是一个简单对象;如果需要 new XXX(),并且还要设置很多属性,那这种就可以称为复杂对象了,因为它的构建过程比较复杂。采用建造者模式,可以把这个复杂的构建过程抽离开,使它不依赖创建者。下面我们通过故事来讲解。你要的故事还记得小时候刚开始学煮汤,不了解怎么煮,第一次是煮了板栗排骨汤,因为板栗比较难熟,所以是跟排骨一起下锅,然后煮了 40 分钟,加了盐就可以出锅啦。第二次煮了冬瓜排骨汤,不懂得冬瓜容易熟,就和排骨一起下锅,煮了也差不多 40 分钟,下了盐和香菜,发现怎么这汤有点浓,冬瓜咋都不见了(全都煮透了),我妈看到这锅汤,才跟我说冬瓜容易熟,得先熬排骨,再放冬瓜进去煮。那时才发现熬汤特么还有这差异。上面是背景哈,接下来我们来实现这个煲汤过程,冬瓜排骨汤是先加排骨,熬制 30 分钟,加冬瓜,熬制 18 分钟,加盐加香菜;板栗排骨汤是先加排骨和板栗,熬制 40 分钟,再加盐。这汤都需要加肉、加菜、熬制、加配料。我们使用下面代码实现这个煲冬瓜排骨汤和板栗排骨汤的过程。public class NoBuilderTest { public static void main(String[] args) { // 熬制冬瓜排骨汤 DongGuaPaiGuSoup dongGuaPaiGuSoup = new DongGuaPaiGuSoup(); // 加排骨 dongGuaPaiGuSoup.addMeat(); // 熬制 30 分钟 dongGuaPaiGuSoup.waitMinute(30); // 加冬瓜 dongGuaPaiGuSoup.addVegetables(); // 熬制 10 分钟 dongGuaPaiGuSoup.waitMinute(10); // 加盐加香菜 dongGuaPaiGuSoup.addIngredients(); // 熬制板栗排骨汤 BanLiPaiGuSoup banLiPaiGuSoup = new BanLiPaiGuSoup(); // 加排骨 banLiPaiGuSoup.addMeat(); // 加板栗 banLiPaiGuSoup.addVegetables(); // 熬制 40 分钟 banLiPaiGuSoup.waitMinute(40); // 加盐 banLiPaiGuSoup.addIngredients(); }}/** * 煲汤接口 /interface Soup { /* 加肉 / void addMeat(); /* 加菜 / void addVegetables(); /* 熬制 / void waitMinute(int minute); /* 加配料 / void addIngredients();}/* * 冬瓜排骨汤 /class DongGuaPaiGuSoup implements Soup { @Override public void addMeat() { System.out.println(“加排骨”); } @Override public void addVegetables() { System.out.println(“加冬瓜”); } @Override public void waitMinute(int minute) { System.out.println(“熬制 " + minute + " 分钟”); } @Override public void addIngredients() { System.out.println(“加盐、加香菜”); }}/* * 板栗排骨汤 /class BanLiPaiGuSoup implements Soup { @Override public void addMeat() { System.out.println(“加排骨”); } @Override public void addVegetables() { System.out.println(“加板栗”); } @Override public void waitMinute(int minute) { System.out.println(“熬制 " + minute + " 分钟”); } @Override public void addIngredients() { System.out.println(“加盐”); }}上面代码简单实现了煲冬瓜排骨汤和板栗排骨汤。煲汤我们要关注的点是:各操作的顺序,是先加肉先煮再加菜,还是肉和菜一起放进锅煮。上面代码中,这个过程是谁控制的?是煲汤的人,所以顺序由煲汤的人决定,甚至有可能忘记放配料啥的,这样子的汤就味道不够好。那怎么去解决这些问题?我们通过建造者模式可以解决上面的 2 个问题:煲汤顺序问题和忘记加配料这种丢三落四行为。我们将这个煲汤顺序从煲汤者分离开来,让煲汤者只需要决定煲什么汤就好,让建造者来保证煲汤顺序问题和防止漏加配料。我们用一个 SoupBuilder 来规范化煲汤过程,方法 buildSoup 给实现者提供一个设置煲汤顺序的地方。因为冬瓜排骨汤和板栗排骨汤熬制的过程不一样,所以分别用 DongGuaPaiGuSoupBuilder 和 BanLiPaiGuSoupBuilder 来具体实现冬瓜排骨汤和板栗排骨汤的熬制过程,也就是消除熬制过程和煲汤者的依赖关系。 Director 则相当于一个菜单,提供为熬汤者来选择熬什么汤。具体代码如下所示。public class BuilderTest { public static void main(String[] args) { Director director = new Director(); // 熬制冬瓜排骨汤 director.buildDongGuaPaiGuSoup(); // 熬制板栗排骨汤 director.buildBanLiPaiGuSoup(); }}/* * 煲汤建造接口 /interface SoupBuilder { void buildSoup(); Soup getSoup();}/* * 冬瓜排骨汤建造者 /class DongGuaPaiGuSoupBuilder implements SoupBuilder { private DongGuaPaiGuSoup dongGuaPaiGuSoup = new DongGuaPaiGuSoup(); @Override public void buildSoup() { // 加排骨 dongGuaPaiGuSoup.addMeat(); // 熬制 30 分钟 dongGuaPaiGuSoup.waitMinute(30); // 加冬瓜 dongGuaPaiGuSoup.addVegetables(); // 熬制 10 分钟 dongGuaPaiGuSoup.waitMinute(10); // 加盐加香菜 dongGuaPaiGuSoup.addIngredients(); } @Override public Soup getSoup() { return dongGuaPaiGuSoup; }}/* * 板栗排骨汤建造者 /class BanLiPaiGuSoupBuilder implements SoupBuilder { BanLiPaiGuSoup banLiPaiGuSoup = new BanLiPaiGuSoup(); @Override public void buildSoup() { // 加排骨 banLiPaiGuSoup.addMeat(); // 加板栗 banLiPaiGuSoup.addVegetables(); // 熬制 40 分钟 banLiPaiGuSoup.waitMinute(40); // 加盐 banLiPaiGuSoup.addIngredients(); } @Override public Soup getSoup() { return banLiPaiGuSoup; }}/* * 生产方 /class Director { private DongGuaPaiGuSoupBuilder dongGuaPaiGuSoupBuilder = new DongGuaPaiGuSoupBuilder(); private BanLiPaiGuSoupBuilder banLiPaiGuSoupBuilder = new BanLiPaiGuSoupBuilder(); /* * 熬制冬瓜排骨汤 / public DongGuaPaiGuSoup buildDongGuaPaiGuSoup() { dongGuaPaiGuSoupBuilder.buildSoup(); return (DongGuaPaiGuSoup) dongGuaPaiGuSoupBuilder.getSoup(); } /* * 熬制板栗排骨汤 */ public BanLiPaiGuSoup buildBanLiPaiGuSoup() { banLiPaiGuSoupBuilder.buildSoup(); return (BanLiPaiGuSoup) banLiPaiGuSoupBuilder.getSoup(); }}通过用建造者实现,是不是保证了熬制汤的顺序并且一定会加够料?感受一下其中的奥秘吧。代码:Builder Pattern总结通过建造者模式,可以把本来强依赖的东西解绑,不仅仅解决依赖问题,还提高了封装性,让使用者不用明白内部的细节,用上面的例子说就熬汤不用关心怎么熬制的过程,就像我们想喝冬瓜排骨汤,告诉妈妈,妈妈熬制,我们并不知道是怎么熬制的。参考资料:《大话设计模式》、《Java设计模式》、《设计模式之禅》、《研磨设计模式》、《Head First 设计模式》推荐阅读:创建型模式:单例模式创建型模式:工厂方法创建型模式:抽象工厂公众号之设计模式系列文章希望文章对您有所帮助,设计模式系列会持续更新,感兴趣的同学可以关注公众号:LieBrother,第一时间获取文章推送阅读,也可以一起交流,交个朋友。 ...

January 26, 2019 · 2 min · jiezi