[英]What is the name of the design pattern where you chain method results of the same object?
[英]What is the name of the design pattern where you have a single-value, strongly typed property container?
尋找設計模式的名稱,通過該名稱您可以擁有一個具有公共最終“屬性”的 POJO,其中該屬性充當某種類型值的持有者/包裝器,並包含該值的 getter/setter 以及可能的一些附加值邏輯。
這與“屬性容器”設計模式不同,在“屬性容器”設計模式中,您有一個包含許多類型的屬性容器,因為它只保存一個值,因此可以享受保持強類型的好處。
使用示例:
public class User extends Entity<User> {
private static final Structure<User> STRUCTURE = Structure.of(User.class, User::new)
.addPrimaryKey("user_id", UUID).property((e) -> e.userID).setDefault(() -> UUID()).build()
.addIndex("username", VCHARS_50).property((e) -> e.username).build()
.addIndex("email", VCHARS_255).property((e) -> e.email).build()
.add("password", VCHARS_255).property((e) -> e.passwordHash).build()
.add("privacy_policy_accepted", EPOCH).property((e) -> e.ppAccepted).setDefault(() -> now()).build()
.add("tos_accepted", EPOCH).property((e) -> e.tosAccepted).setDefault(() -> now()).build()
.add("registration_date", EPOCH).property((e) -> e.registrationDate).setDefault(() -> now()).build()
.buildFor(Schema.MASTER);
public final Property<UUID> userID = new Property<>();
public final Property<String> username = new Property<>();
public final Property<String> email = new Property<>();
public final Property<String> passwordHash = new Property<>();
public final Property<Long> ppAccepted = new Property<>();
public final Property<Long> tosAccepted = new Property<>();
public final Property<Long> registrationDate = new Property<>();
public User() {
super(STRUCTURE);
}
public void hashAndSetPassword(String password) {
this.passwordHash.set(Argon2Factory.create(Argon2Types.ARGON2id).hash(3, 102800, 1, password.toCharArray()));
}
public boolean verifyPassword(String attempt) {
return Argon2Factory.create(Argon2Types.ARGON2id).verify(passwordHash.get(), attempt.toCharArray());
}
}
使用以下每個實體屬性:
public class Property<T> {
private T currentValue;
public void set(T newValue) {
this.currentValue = newValue;
}
public T get() {
return this.currentValue;
}
@Override
public boolean equals(Object o) {
return Objects.equals(currentValue, o);
}
@Override
public int hashCode() {
return Objects.hashCode(currentValue);
}
@Override
public String toString() {
return String.valueOf(currentValue);
}
}
我們可以擴展或修改這個 Properties 類,讓它為我們做更多有用的事情,比如讓它記錄一個原始值,在創建時提供(從數據庫中提取)並允許它自我報告屬性的當前值是否與原來的不同。 用於確定需要在數據庫中更新哪些列。
最值得注意的是,這消除了為每個新屬性創建 getter 和 setter 的需要,因為 Property 已經具有該功能。 此外,如果需要額外的邏輯,getter/setter 能夠被每個屬性覆蓋。
我自然而然地最終使用了這種設計,同時瞄准了一個更廣泛的目標,即從我的 Web 框架中消除使用反射/注釋處理器和其他黑魔法。 但是,我很難在互聯網上找到它,以便我能夠研究它的潛在缺陷。
這種包裝器“變量”用於諸如 StringProperty 之類的 Observable 屬性。 它的主要用途是保持狀態並具有更改偵聽器,通常是綁定。
它得到了卓有成效的使用,就像在 JavaFX 中一樣。 正如您所提到的,在實體框架中。 但它絕對是有狀態的、非功能性的、可變的。
一個我找不到的模式名稱,如果將其稱為模式,我認為 4 人的幫派會困擾一個,而不是State 。
感謝@Michael和@Kayaman在評論中的回答:這不是一個已知的設計模式,與我的預期相反。
換句話說,沒有一個人們通常知道的名稱來指代我所謂的“屬性”,也沒有我建議的設計,它假設需要公共 getter 和 setter 並使用公共 final 字段來公開包裝器這提供了他們。
正如 Kayaman 指出的那樣,這可能是因為它非常重,但並不是非常有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.