日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

打造智能建筑商

發(fā)布時(shí)間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 打造智能建筑商 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

構(gòu)建API時(shí),您應(yīng)該始終考慮誰(shuí)將使用它。 當(dāng)API簡(jiǎn)單易用時(shí),用戶就會(huì)感到滿意。 當(dāng)用戶滿意時(shí),每個(gè)人也都會(huì)滿意。 但是出色的可用性并非總是容易實(shí)現(xiàn)的。 有一些模式對(duì)此有所幫助,在這篇文章中,我將重點(diǎn)介紹經(jīng)典的構(gòu)建器模式,以及如何使用步進(jìn)構(gòu)建器模式對(duì)其進(jìn)行增強(qiáng),以構(gòu)建沒(méi)有大腦接口,易于使用且不會(huì)出錯(cuò)的對(duì)象 。 因此,讓我們開(kāi)始繪制一些上下文,我們有2個(gè)域?qū)ο蟠磉B接到某個(gè)遠(yuǎn)程或本地服務(wù)器的用戶配置。 當(dāng)需要遠(yuǎn)程憑據(jù)時(shí),在本地時(shí)。

package com.marco.sbp; public class UserConfiguration {private final String name;private ServerDetails serverDetails;public UserConfiguration(String name) {this.name = name;}public void setServerDetails(ServerDetails serverDetails) {this.serverDetails = serverDetails;}public String getName() {return name;}public ServerDetails getServerDetails() {return serverDetails;} }package com.marco.sbp; public class ServerDetails {private final String host;private String user;private String password;public ServerDetails(String host) {this.host = host;}public void setUser(String user) {this.user = user;}public void setPassword(String password) {this.password = password;}public String getHost() {return host;}public String getUser() {return user;}public String getPassword() {return password;} }

我們希望使用兩種不同的技術(shù)(經(jīng)典的構(gòu)建器模式和步驟構(gòu)建器模式)來(lái)抽象上述對(duì)象的構(gòu)造。

經(jīng)典的構(gòu)建器模式非常簡(jiǎn)單,它使用諸如onLocalHost,onRemoteHost等正確命名的方法來(lái)掩蓋UserConfiguration和ServerDetails的創(chuàng)建。

package com.marco.sbp.builder; import com.marco.sbp.ServerDetails; import com.marco.sbp.UserConfiguration; public class ClassicBuilder {private String name;private String host;private String user;private String password;public ClassicBuilder(String name){this.name = name;}public ClassicBuilder onLocalHost(){this.host = "localhost";return this;}public ClassicBuilder onRemoteHost(String remoteHost){this.host = remoteHost;return this;}public ClassicBuilder credentials(String user, String password){this.user = user;this.password = password;return this;}public UserConfiguration build(){UserConfiguration userConfiguration = new UserConfiguration(name);ServerDetails serverDetails = new ServerDetails(host);serverDetails.setUser(user);serverDetails.setPassword(password); ? ? ? ? ? ? ? ? ? ?userConfiguration.setServerDetails(serverDetails);return userConfiguration;} }

步驟構(gòu)建器模式仍在使用智能名稱來(lái)構(gòu)造對(duì)象,但是僅在需要使用接口和適當(dāng)?shù)姆庋b時(shí)才公開(kāi)這些方法。

package com.marco.sbp.builder; import com.marco.sbp.ServerDetails; import com.marco.sbp.UserConfiguration;/** "Step Builder" */ public class StepBuilder {public static NameStep newBuilder() {return new Steps();}private StepBuilder() {}public static interface NameStep {/*** @param name* ? ? ? ? ? ?unique identifier for this User Configuration* @return ServerStep*/ServerStep name(String name);} ? ? ? public static interface ServerStep {/*** The hostname of the server where the User Configuration file is stored will be set to "localhost".* * @return BuildStep*/public BuildStep onLocalhost();/*** The hostname of the server where the User Configuration file is stored.* * @return CredentialsStep*/public CredentialsStep onRemotehost(String host);}public static interface CredentialsStep {/*** Username required to connect to remote machine Password required to connect to remote machine* * @return BuildStep*/public BuildStep credentials(String user, String password);}public static interface BuildStep {/*** @return an instance of a UserConfiguration based on the parameters passed during the creation.*/public UserConfiguration build();}private static class Steps implements NameStep, ServerStep, CredentialsStep, BuildStep {private String name;private String host;private String user;private String password;public BuildStep onLocalhost() {this.host = "localhost";return this;}public ServerStep name(String name) {this.name = name;return null;}public CredentialsStep onRemotehost(String host) {this.host = host;return this;}public BuildStep credentials(String user, String password) {this.user = user;this.password = password;return this;}public UserConfiguration build() {UserConfiguration userConfiguration = new UserConfiguration(name);ServerDetails serverDetails = new ServerDetails(host);serverDetails.setUser(user);serverDetails.setPassword(password); ? ? ? ? ? ? ? ? ? ?userConfiguration.setServerDetails(serverDetails);return userConfiguration;}} }

現(xiàn)在讓我們看一下兩個(gè)構(gòu)建器的用戶體驗(yàn)。 經(jīng)典構(gòu)建器將使用用戶配置的名稱來(lái)構(gòu)造,然后它將公開(kāi)其所有方法,從而使用戶過(guò)于自由,無(wú)法選擇下一步。

例如,一個(gè)不小心的用戶可能最終將UserConfiguration設(shè)置為localhost,而無(wú)需身份驗(yàn)證,仍然傳遞用戶名和密碼。

這令人困惑,并且可能導(dǎo)致運(yùn)行時(shí)異常。

這些是用戶可以最終得到的UserConfigurations的一些可能組合,其中一些是正確的,很多是錯(cuò)誤的:

步驟構(gòu)建器有一個(gè)完全不同的故事,這里僅顯示了當(dāng)時(shí)的一個(gè)步驟:

如果不需要憑據(jù),則不會(huì)公開(kāi)它們,只有在確保對(duì)象狀態(tài)一致且完整時(shí)才提供build()方法:

使用此模式只能構(gòu)建2個(gè)可能的UserConfigurations,它們既有意義又對(duì)用戶清楚。

結(jié)論

步驟構(gòu)建器模式不是經(jīng)典Bloch 模式的替代,有時(shí)您想強(qiáng)迫用戶在進(jìn)行創(chuàng)建之前填充一些參數(shù),在這種情況下,步驟構(gòu)建器正在執(zhí)行此工作,否則,當(dāng)需要更開(kāi)放的方法時(shí)比經(jīng)典的建造者更適合您。

參考:從我們的JCG合作伙伴 Marco Castigliego(在“ 刪除重復(fù)并修復(fù)不良名稱”博客中) 構(gòu)建智能構(gòu)建器 。

翻譯自: https://www.javacodegeeks.com/2013/05/building-smart-builders.html

總結(jié)

以上是生活随笔為你收集整理的打造智能建筑商的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。