簡體   English   中英

具有單值、強類型屬性容器的設計模式的名稱是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM